Cod sursa(job #264267)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 21 februarie 2009 20:43:42
Problema Kdrum Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <stdio.h>

long N,M,D[70][70],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[100],div[100],s[100][100][10],ndiv,w;
struct drum
{
    int c,l,d;
}
q[700];

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 drum()
{
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[1]; 
le2=1;
s[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];   
                w=s[q[le1].l][q[le1].c][q[le1].d]+1;   
                if(s[lne][cne][poz[qq]]>w || !s[lne][cne][poz[qq]])
                {   
                 s[lne][cne][poz[qq]]=w;   
                 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=0;i<N;++i)
         for (j=0;j<M;++j)
                {
                    scanf("%ld", &A[i][j]);
                    //D[i][j]=666666;
                }
                
               divizori(K);

                X1--;
                Y1--;
                X2--;
                Y2--;
                //A[X1][Y1]='.';
                //A[X2][Y2]='.';
                drum();
                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",s[X2][Y2][poz[1]]);
    return 0;
}