Cod sursa(job #1281071)

Utilizator OctaDuiu Octavian Octa Data 2 decembrie 2014 20:22:13
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<cstdio>
#include<queue>
using namespace std;

int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};

struct nod { int x,y,t; };
queue < nod > q;

int n,m,k,x1,x2,ndiv,y1,y2,i,j,x,y,t,x_new,y_new,t_new;
int u[55][55][205],A[55][55],div[205],p[12100];

int gcd(int x, int y)
{
    if(!y) return x;
    return gcd(y, x%y);
}

bool okay(int x, int y)
{
    if(x<1 || y<1 || x>n || y>m) return 0;

 return 1;
}
void lee(int x1, int y1)
{
     u[x1][y1][p[gcd(k,A[x1][y1])]]=1;
     q.push((nod){x1, y1, p[gcd(k,A[x1][y1])]});

     while(!q.empty ())
     {
            x=q.front().x;
            y=q.front().y;
            t=q.front().t;
            q.pop ();

     for(int it=0;it<=3;++it)
     {
         x_new=x+dx[it]; y_new=y+dy[it];

         if(!okay(x_new,y_new) || !A[x_new][y_new]) continue;

         t_new=p[gcd(A[x_new][y_new]*div[t],k)];

         if(u[x_new][y_new][t_new])                 continue;

         u[x_new][y_new][t_new]=u[x][y][t]+1;
         q.push((nod){x_new,y_new,t_new});
     }

     }
}
int main()
{
    freopen("kdrum.in","r",stdin);freopen("kdrum.out","w",stdout);

    scanf("%d %d %d",&n,&m,&k);
    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            scanf("%d",&A[i][j]);

    int  ndiv=0;
    for(i=1;i<=k;++i)
        if(!(k%i)) div[++ndiv]=i,p[i]=ndiv;

    lee(x1,y1);

    printf("%d\n",u[x2][y2][p[k]]);

    return 0;
}