Cod sursa(job #254733)

Utilizator crisy_girlpop cristina crisy_girl Data 7 februarie 2009 13:55:49
Problema Kdrum Scor 10
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.7 kb
#include<stdio.h>
int N,M,K,T,F,X1,X2,Y1,Y2,S2[51][51],S[51][51],B[51][51],L[20000][2];
int main()
{
    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);
    L[1][1]=X1;L[1][2]=Y1;
    for (int i=1;i<=N;++i)
        for (int j=1;j<=M;++j)
            scanf("%d",&B[i][j]);
    T=1;F=1;
    S2[X1][Y1]=B[X1][Y1];S[X1][Y1]=0;
    for (T;T<=F;++T)
    {
         int li=L[T][1],co=L[T][2];
         if ((li>1)&&(B[li-1][co]!=0)&&((S[li][co]<=S[li-1][co]) || (S2[li-1][co]==0)) )
         if (((li-1!=X2)||(co!=Y2))||((S2[li][co]*B[li-1][co])%K==0))
         {++F;L[F][1]=li-1;L[F][2]=co;
         S2[li-1][co]=B[li-1][co]*S2[li][co];
         S[li-1][co]=S[li][co]+1;
         }
         if ((li<N)&&(B[li+1][co]!=0)&&((S[li][co]<=S[li+1][co]) || (S2[li+1][co]==0) ) )
         if (((li+1!=X2)||(co!=Y2))||((S2[li][co]*B[li+1][co])%K==0))
         {++F;L[F][1]=li+1;L[F][2]=co;
         S2[li+1][co]=B[li+1][co]*S2[li][co];
         S[li+1][co]=S[li][co]+1;
         }
         if ((co>1)&&(B[li][co-1]!=0)&&((S[li][co]<=S[li][co-1]) || (S2[li][co-1]==0) ) )
         if (((li!=X2)||(co-1!=Y2))||((B[li][co-1]*S2[li][co])%K==0))
         {++F;L[F][1]=li;L[F][2]=co-1;
         S2[li][co-1]=B[li][co-1]*S2[li][co];
         S[li][co-1]=S[li][co]+1;
         }
         if ( (co<N)&&(B[li][co+1]!=0)&& ( (S[li][co]<=S[li][co+1]) || (S2[li][co+1]==0) ) )
         if( ((li!=X2)||(co+1!=Y2)) || ((B[li][co+1]*S2[li][co])%K==0))        
         {++F;L[F][1]=li;L[F][2]=co+1;
         S2[li][co+1]=B[li][co+1]*S2[li][co];
         S[li][co+1]=S[li][co]+1;
         }
    }
    printf("%d",S[X2][Y2]+1);
    return 0; 
}