Cod sursa(job #264685)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 22 februarie 2009 16:28:23
Problema Kdrum Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <stdio.h>

int A[70][70],N,M,K,X1,X2,Y1,Y2,D[60][60][120],div[130];
int poz[12010],i,j,nrd,ls,ld,ll,cc,k,lne,cne,h,g;
struct drum
{
    int l,c,d;
}
q[12010];
int dl[]={0,1,0,-1};
int dc[]={-1,0,1,0};

void read_data()
{
    freopen("kdrum.in","r",stdin);
    
    
    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]);
    
       
    for (i=1;i<=K;++i)
    {
        if (K%i==0)
        {
            div[++nrd]=i;
            poz[i]=nrd;
        }
    }
}

int cmmdc(int a, int b)
{
    int r;
    while(r)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}

void solve()
{
    ls=1;
    ld=1;
    q[1].l=X1;
    q[1].c=Y1;
    g=cmmdc(K,A[X1][Y1]);
    q[1].d=poz[K/g];
    D[X1][Y1][poz[K/g]]=1;
    
    while(ls<=ld)
    {
        ll=q[ls].l;
        cc=q[ls].c;
        for (k=0;k<4;++k)
        {
            lne=ll+dl[k];
            cne=cc+dc[k];
            if (lne>0 && lne<=N && cne>0 && cne<=M && A[lne][cne])
            {
                h=div[q[ls].d]/cmmdc(div[q[ls].d],A[lne][cne]);
                if (D[lne][cne][poz[h]]>D[q[ls].l][q[ls].c][q[ls].d]+1 || D[lne][cne][poz[h]]==0)
                {
                    D[lne][cne][poz[h]]=D[q[ls].l][q[ls].c][q[ls].d]+1;
                    ld++;
                    q[ld].l=lne;
                    q[ld].c=cne;
                    q[ld].d=poz[h];
                }
            }
        }
        ls++;
    }
}

void write_data()
{
    freopen("kdrum.out","w",stdout);
    printf("%d\n", D[X2][Y2][poz[1]]);
}

int main()
{
    read_data();
    solve();
    write_data();
    return 0;
}