Cod sursa(job #254497)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 7 februarie 2009 12:29:19
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.45 kb
#include<stdio.h>
long n,m,k,x1,x2,y1,y2,i,j,a[60][60],st,dr,x[1000],y[1000],s[1000],p[1000],min,h[60][60];
int main()
{
 freopen("kdrum.in","r",stdin);
 freopen("kdrum.out","w",stdout);
 scanf("%ld%ld%ld",&n,&m,&k);
 scanf("%ld%ld%ld%ld",&x1,&y1,&x2,&y2);
 for(i=1;i<=n;++i)
   for(j=1;j<=m;++j)
      scanf("%ld",&a[i][j]);
 st=0;
 dr=1;
 x[1]=x1;
 y[1]=y1;
 s[1]=1;
 p[1]=1;
 min=999999;
 h[1][1]=1;
 while(++st<=dr)
  {
   if(h[x[st]+1][y[st]]==0&&a[x[st]+1][y[st]])
   {h[x[st]+1][y[st]]=1;
    x[++dr]=x[st]+1;
    y[dr]=y[st];
    s[dr]=s[st]*a[x[dr]][y[dr]];
    p[dr]=p[st]+1;
    if(x[dr]==x2&&y[dr]==y2&&s[dr]%k==0&&p[dr]<min)
      {min=p[dr];break;}}

   if(h[x[st]-1][y[st]]==0&&a[x[st]-1][y[st]])
   {h[x[st]-1][y[st]]=1;
    x[++dr]=x[st]-1;
    y[dr]=y[st];
    s[dr]=s[st]*a[x[dr]][y[dr]];
    p[dr]=p[st]+1;
    if(x[dr]==x2&&y[dr]==y2&&s[dr]%k==0&&p[dr]<min)
      {min=p[dr];break;}}

   if(h[x[st]][y[st]+1]==0&&a[x[st]][y[st]+1])
   {h[x[st]][y[st]+1]=1;
    x[++dr]=x[st];
    y[dr]=y[st]+1;
    s[dr]=s[st]*a[x[dr]][y[dr]];
    p[dr]=p[st]+1;
    if(x[dr]==x2&&y[dr]==y2&&s[dr]%k==0&&p[dr]<min)
      {min=p[dr];break;}}

   if(h[x[st]][y[st]-1]==0&&a[x[st]][y[st]-1])
   {h[x[st]][y[st]-1]=1;
    x[++dr]=x[st];
    y[dr]=y[st]-1;
    s[dr]=s[st]*a[x[dr]][y[dr]];
    p[dr]=p[st]+1;
    if(x[dr]==x2&&y[dr]==y2&&s[dr]%k==0&&p[dr]<min)
      {min=p[dr];break;}}
  }
 printf("%ld\n",min);
 return 0;
}