Cod sursa(job #264940)

Utilizator andumMorie Daniel Alexandru andum Data 22 februarie 2009 23:38:34
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <stdio.h>
#include <stdlib.h>

struct coada{
             int l,c,v;
            }c[51*51*130];

long a[51][51],k,n,m,i,j,p,u,x1,y1,x2,y2,la,ca,lv,cv,di[130],f[12001],d[51][51][130],de;
long dx[4]={-1, 0, 1, 0};
long dy[4]={0, 1, 0, -1};

long cmmdc(long a, long b)
{
    long r;
    do
        {
            r=a%b;
	    a=b;
            b=r;
        }while (r!=0)
    return a;
}

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

    scanf("%ld %ld %ld", &n, &m, &k);
    scanf("%ld %ld %ld", &x1, &y1, &x2, &y2);
    for (i=1;i<=n;i++)
    for (j=1;j<=m;j++)
        scanf("%ld", &a[i][j]);
    for (i=1;i<=n;i++)
        {
            a[i][0]=-1;
            a[i][n]=-1;
        }
    for (i=1;i<=m;i++)
        {
            a[0][i]=-1;
            a[m][i]=-1;
        }
    for(i=1;i<=k;i++)
      if(!(k%i))
        {
             di[0]++;
             di[di[0]]=i;
             f[i]=di[0];
        }
    p=u=1;
    c[p].l=x1;
    c[p].c=y1;
    c[p].v=cmmdc(a[x1][y1],k);
    d[x1][y1][f[cmmdc(a[x1][y1],k)]]=1;
    while (p<=u)
        {
            la=c[p].l;
            ca=c[p].c;
            for (i=0;i<4;i++)
                {
                    lv=la+dx[i];
                    cv=ca+dy[i];
                    de=cmmdc((c[p].v*a[lv][cv]),k);
                    if (a[lv][cv] && !d[lv][cv][f[de]])
                        {
                            u++;
                            c[u].l=lv;
                            c[u].c=cv;
                            c[u].v=de;
                            d[lv][cv][f[de]]=d[c[p].l][c[p].c][f[c[p].v]]+1;
                            if (lv==x2 && cv==y2 && d[x2][y2][di[0]])
                                {
                                    printf("%ld", d[x2][y2][di[0]]);
                                    exit(0);
                                }
                        }
                }
            p++;
        }

    return 0;
}