Cod sursa(job #264284)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 21 februarie 2009 21:02:52
Problema Kdrum Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <stdio.h>   
  
long N,M,i,j,X1,X2,Y1,Y2,ql[100],qc[1500],qq,nr,le1,le2,ok,l,c,x,K,p,min;   
long A[70][70];   
int dl[]={-1,0,+1,0};   
int dc[]={0,+1,0,-1};   
long qd[100],poz[12000],div[12000],D[100][100][10],ndiv,w;   
struct drum   
{   
    int c,l,d;   
}   
q[12100];   
  
int cmmdc(int a, int b)   
{   
    int r;   
    while(b)   
    {   
        r=a%b;   
        a=b;   
        b=r;   
    }   
    return a;   
}   
  
void divizori(int x)   
{   
    for (i=1;i<=x;++i)   
        if (x%i==0)   
        {   
          div[++ndiv]=i;   
          poz[i]=ndiv;   
        }   
}   
  
int posibil(int X, int Y)   
{   
    return (X>0 && X<=N && Y>0 && Y<=M);   
}   
  
void lee()   
{   
long l,c,lne,cne,k;   
le1=1;   
q[1].l=X1;   
q[1].c=Y1;   
/*D[X1][Y1]=0;  
ql[2]=X2;  
qc[2]=Y2;*/  
q[1].d=poz[K/(cmmdc(K,A[X1][Y1]))];    
le2=1;   
D[X1][Y1][q[1].d]=1;    
  
  
while (le1<=le2)   
    {   
    l=q[le1].l;   
    c=q[le1].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=div[q[le1].d]/(cmmdc(div[q[le1].d],A[lne][cne]));      
                if(D[lne][cne][poz[qq]]>D[q[le1].l][q[le1].c][q[le1].d]+1 || !D[lne][cne][poz[qq]])   
                {      
                 D[lne][cne][poz[qq]]=D[q[le1].l][q[le1].c][q[le1].d]+1;      
                 le2++;      
                 q[le2].l=lne;      
                 q[le2].c=cne;      
                 q[le2].d=poz[qq];      
                }   
            }   
        }   
     }   
    le1++;   
    }   
}   
  
  
int main()   
{   
    freopen("kdrum.in","r",stdin);   
       
    scanf("%ld %ld %ld", &N,&M,&K);   
    scanf("%ld %ld %ld %ld\n",&X1,&Y1,&X2,&Y2);   
    for (i=1;i<=N;++i)   
         for (j=1;j<=M;++j)   
                {   
                    scanf("%ld", &A[i][j]);   
                    //D[i][j]=666666;   
                }   
                   
               divizori(K);   
  
                //X1--;   
                //Y1--;   
                //X2--;   
                //Y2--;   
                //A[X1][Y1]='.';   
                //A[X2][Y2]='.';   
                lee();   
                freopen("kdrum.out","w",stdout);   
                //if (K==1) printf("%ld\n", D[X2][Y2]+1);   
                /*else  
                {  
                  min=666666;  
                  p=1;  
                  nr=1;  
                  pas(X1,Y1,X2,Y2);    
                  if (p%K==0)    
                      if (min>nr)  
                           min=nr;    
                  printf("%ld\n",min);                     
                }*/  
                printf("%ld",D[X2][Y2][poz[1]]);   
    return 0;   
}