Cod sursa(job #254312)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 7 februarie 2009 11:08:38
Problema Kdrum Scor 20
Compilator c Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 2.29 kb
#include <stdio.h>

int N,M,D[70][70],i,j,X1,X2,Y1,Y2,ql[500],qc[500],q,nr,le1,le2,ok,l,c,x,K,p,min;
char A[70][70];
int dl[]={-1,0,+1,0};
int dc[]={0,+1,0,-1};


void pas(int xi,int yi,int xf, int yf)
{
if ((xi!=xf) || (yi!=yf))
    {  
      if ((xf>0) && (D[xf-1][yf]==D[xf][yf]-1)) {pas(xi,yi,xf-1,yf);p*=D[xf-1][yf];nr++;}   
                      else  
      if ((xf+1<N) && (D[xf+1][yf]==D[xf][yf]-1)) {pas(xi,yi,xf+1,yf);p*=D[xf+1][yf];nr++;}   
                      else  
      if ((yf>0) && (D[xf][yf-1]==D[xf][yf]-1)) {pas(xi,yi,xf,yf-1);p*=D[xf][yf-1];nr++;}   
                      else  
      if ((yf+1<M) && (D[xf][yf+1]==D[xf][yf]-1)) {pas(xi,yi,xf,yf+1);p*=D[xf][yf+1];nr++;}   
    }
}

void drum()
{
int l,c,lne,cne,k;
le1=1;
ql[1]=X1;
qc[1]=Y1;
D[X1][Y1]=0;
ql[2]=X2;
qc[2]=Y2;
le2=3;

while (le1<le2)
    {
    l=ql[le1];
    c=qc[le1];
    for (k=0;k<4;++k)
        {
        lne=l+dl[k];
        cne=c+dc[k];
        if (lne>=0 && lne<=N && cne>=0 && cne<=M)
            {
             if (D[lne][cne]>D[l][c]+1 && A[lne][cne]!='X')
                {
                D[lne][cne]=D[l][c]+1;
                nr++;
                ql[le2]=lne;
                qc[le2++]=cne;
                }
            }
        }
        le1++;
    }
}


int main()
{
    freopen("kdrum.in","r",stdin);
    freopen("kdrum.out","w",stdout);
    scanf("%d %d %d", &N,&M,&K);
    scanf("%d %d %d %d\n",&X1,&Y1,&X2,&Y2);
    for (i=0;i<N;++i)
         for (j=0;j<M;++j)
                {
                    scanf("%d", &x);
                    if (x==0) A[i][j]='X';
                         else A[i][j]='.';
                    D[i][j]=666666;
                }
                X1--;
                Y1--;
                X2--;
                Y2--;
                A[X1][Y1]='.';
                A[X2][Y2]='.';
                drum();
                if (K==1) printf("%d\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("%d\n",min);                   
                }
    return 0;
}