Cod sursa(job #1339570)

Utilizator EberardoVladianu Cosmin Eberardo Data 10 februarie 2015 23:26:12
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <fstream>

using namespace std;
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
short n,m,k,x1,y1,x2,y2,num,v1[12001],v2[12001];
int a[53][53];
struct structura2
{
    int x,y,d,nr;
}s[500000],sol;
void citire()
{
    fin>>n>>m>>k;
    fin>>x1>>y1>>x2>>y2;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            fin>>a[i][j];
}
short cmmdc(int a,int b)
{
    int r;
    if(a<b)
    {
        a=a+b;
        b=a-b;
        a=a-b;
    }
    while(b!=0)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
void divi()
{
    num++;
    v1[1]=1;
    v2[1]=1;
    if(k==1) return;
    for(short d=2; d<=k/2; d++)
        if(k%d==0)
        {
            v1[d]=++num;
            v2[num]=d;
        }
    num++;
    v1[k]=num;
    v2[num]=k;
}
bool egal(structura2 i,structura2 j)
{
    if(i.x!=j.x) return 0;
    if(i.y!=j.y) return 0;
    if(i.d!=j.d)  return 0;
    return 1;

}
void rez()
{
    unsigned long long div;
    short lin,col;
    unsigned long long num=1,poz=1;
    s[1].x=x1;
    s[1].y=y1;
    s[1].d=v1[cmmdc(a[x1][y1],k)];
    s[1].nr=1;
    while(!egal(s[poz],sol))
    {
        lin=s[poz].x;
        col=s[poz].y;
        if(a[lin][col-1]!=0)
        {
            num++;
            s[num].x=lin;
            s[num].y=col-1;
            div=cmmdc(a[lin][col-1],k);
            s[num].d=v1[cmmdc(div*v2[s[poz].d],k)];
            s[num].nr=s[poz].nr+1;

        }
        if(a[lin][col+1]!=0)
        {
            num++;
            s[num].x=lin;
            s[num].y=col+1;
            div=cmmdc(a[lin][col+1],k);
            s[num].d=v1[cmmdc(div*v2[s[poz].d],k)];
            s[num].nr=s[poz].nr+1;

        }
        if(a[lin-1][col]!=0)
        {
            num++;
            s[num].x=lin-1;
            s[num].y=col;
            div=cmmdc(a[lin-1][col],k);
            s[num].d=v1[cmmdc(div*v2[s[poz].d],k)];
            s[num].nr=s[poz].nr+1;

        }
        if(a[lin+1][col]!=0)
        {
            num++;
            s[num].x=lin+1;
            s[num].y=col;
            div=cmmdc(a[lin+1][col],k);
            s[num].d=v1[cmmdc(div*v2[s[poz].d],k)];
            s[num].nr=s[poz].nr+1;

        }
        poz++;
    }
    fout<<s[poz].nr;
}
int main()
{


    citire();
    divi();
    sol.x=x2;
    sol.y=y2;
    sol.d=v1[k];
    rez();
    return 0;
}