Cod sursa(job #264258)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 21 februarie 2009 20:37:13
Problema Kdrum Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <stdio.h>
#include <string.h>
#include <math.h>

#define Nmax 70
#define Inf 0x3f3f3f3f

int dl[]={-1,0,+1,0};
int dc[]={0,+1,0,-1};
int N,M,K;
int X1,Y1,X2,Y2;
int i,j,lne,cne;
int D[Nmax][Nmax][Nmax];
int lee1,lee2,x,k;
int l,c;
int pozd[20*Nmax];
int nrd,diviz[10*Nmax];
int w,qq;
int s[Nmax][Nmax][Nmax];
int A[Nmax][Nmax];

struct drum
{
    int c,l,d;
}
q[7*Nmax];

void divizori(int x)
{
    for (i=1;i<=x;++i)
        if (x%i==0)
        {
          diviz[++nrd]=i;
          pozd[i]=nrd;
        }
}

void read_data()
{
    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);
    
    divizori(K);
    for (i=0;i<N;++i)
          for (j=0;j<M;++j)
               {
                   scanf("%d",&x);
                   A[i][j]=x;     
               }  
          X1--;
          X2--;
          Y1--;
          Y2--;     
}

int posibil(int X, int Y)
{
    return (X>=0 && X<=N && Y>=0 && Y<=M);
}   

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

void lee()
{
    memset(D,0,sizeof(D));
    lee1=1;
    lee2=1;   
    q[lee1].l=X1;   
    q[lee1].c=Y1;   
    q[lee1].d=pozd[K/cmmdc(A[X1][Y1],K)];
    D[X1][Y1][q[lee1].d]=1;
  
    while (lee1<=lee2)
    {
    l=q[lee1].l;
    c=q[lee1].c;
    for (k=0;k<4;++k)
        {
        lne=l+dl[k];
        cne=c+dc[k];
        if (posibil(lne,cne))
            {
             if (A[lne][cne]!=0)
                {
                qq=diviz[q[lee1].d]/cmmdc(A[lne][cne],diviz[q[lne].d]);
                w=D[q[lee1].l][q[lee1].c][q[lee1].d]+1;
                if(D[lne][cne][pozd[qq]]>w || D[lne][cne][pozd[qq]]!=0)
                {
                 D[lne][cne][pozd[qq]]=w;
                 lee2++;
                 q[lee2].l=lne;
                 q[lee2].c=cne;
                 q[lee2].d=pozd[qq];
                }
            }
        }
     }
    lee1++;
    }
}


void solve()
{
    lee();
    //if (K==1)
      //  printf("%d", D[X2][Y2]+1);
    
    printf("%d\n", D[X2][Y2][pozd[1]]);
}
    
int main()
{
    read_data();
    solve();
    return 0;
}