Cod sursa(job #254396)

Utilizator sigridMaria Stanciu sigrid Data 7 februarie 2009 11:51:54
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 3.58 kb
#include<fstream.h>
#define dim 4//51


ifstream f("kdrum.in");
ofstream g("kdrum.out");

int mat[dim][dim],div[dim][dim],min[dim][dim],c[dim*dim][2];
int n,m,k;


int main()
{

int i,j,sx,sy,fx,fy,ok,okd,x,y,ddo=0,prim,ultim;

f>>n>>m>>k;
f>>sx>>sy>>fx>>fy;

for(i=1;i<=n;i++)
 for(j=1;j<=m;j++)
  {
    f>>mat[i][j];
    div[i][j]=mat[i][j];

    min[i][j]=15;//32000;
  }

f.close();

okd=0;
ok=0;

prim=ultim=1;
c[prim][0]=sx;
c[prim][1]=sy;
min[sx][sy]=1;

while( (!ddo) && (prim<=ultim) )
{
 //extrag elementul curent din coada
 x=c[prim][0];
 y=c[prim][1];

 //parcurg cele 4 directii
   //.1: x-1 y
  if( (mat[x-1][y]) && (okd) )
    {
     if(min[x-1][y] > (min[x][y]+1) )
	{ultim++;
	 c[ultim][0]=x-1;
	 c[ultim][1]=y;

	 min[x-1][y]=min[x][y]+1;
	 div[x-1][y]=div[x][y]*mat[x-1][y];

	 if( ((x-1)==fx) && (y==fy) ) ok=1;
	}

    }

  if( (mat[x-1][y]) && (!okd) )
    {
     if( ( (div[x][y]*mat[x-1][y]) %k)==0 )
	{ultim++;
	 c[ultim][0]=x-1;
	 c[ultim][1]=y;

	 min[x-1][y]=min[x][y]+1;
	 div[x-1][y]=div[x][y]*mat[x-1][y];

	 okd=1;
	}
	else
	   {
	     if(min[x-1][y] > (min[x][y]+1) )
		{ultim++;
		 c[ultim][0]=x-1;
		 c[ultim][1]=y;

		 min[x-1][y]=min[x][y]+1;
		 div[x-1][y]=div[x][y]*mat[x-1][y];

	    //	 okd=1;
		}

	   }

    }

   //.2: x y+1
  if( (mat[x][y+1]) && (okd) )
    {
     if(min[x][y+1] > (min[x][y]+1) )
	{ultim++;
	 c[ultim][0]=x;
	 c[ultim][1]=y+1;

	 min[x][y+1]=min[x][y]+1;
	 div[x][y+1]=div[x][y]*mat[x][y+1];

	 if( (x==fx) && ((y+1)==fy) ) ok=1;
	}

    }

  if( (mat[x][y+1]) && (!okd) )
    {
     if( ( (div[x][y]*mat[x][y+1]) %k)==0 )
	{ultim++;
	 c[ultim][0]=x;
	 c[ultim][1]=y+1;

	 min[x][y+1]=min[x][y]+1;
	 div[x][y+1]=div[x][y]*mat[x][y+1];

	 okd=1;
	}
	else
	   {
	    //if( (k%mat[x][y+1])==0 )
	    if(min[x][y+1] > (min[x][y]+1) )
		{ultim++;
		 c[ultim][0]=x;
		 c[ultim][1]=y+1;

		 min[x][y+1]=min[x][y]+1;
		 div[x][y+1]=div[x][y]*mat[x][y+1];

	      //	 okd=1;
		}

	   }

    }

   //.3: x+1 y
  if( (mat[x+1][y]) && (okd) )
    {
     if(min[x+1][y] > (min[x][y]+1) )
	{ultim++;
	 c[ultim][0]=x+1;
	 c[ultim][1]=y;

	 min[x+1][y]=min[x][y]+1;
	 div[x+1][y]=div[x][y]*mat[x+1][y];

	 if( ((x+1)==fx) && (y==fy) ) ok=1;
	}

    }

  if( (mat[x+1][y]) && (!okd) )
    {
     if( ( (div[x][y]*mat[x+1][y]) %k)==0 )
	{ultim++;
	 c[ultim][0]=x+1;
	 c[ultim][1]=y;

	 min[x+1][y]=min[x][y]+1;
	 div[x+1][y]=div[x][y]*mat[x+1][y];

	 okd=1;
	}
	else
	   {
	    //if( (k%mat[x+1][y])==0 )
	    if(min[x+1][y] > (min[x][y]+1) )
		{ultim++;
		 c[ultim][0]=x+1;
		 c[ultim][1]=y;

		 min[x+1][y]=min[x][y]+1;
		 div[x+1][y]=div[x][y]*mat[x+1][y];

	      //	 okd=1;
		}

	   }

    }

   //.4: x y-1
  if( (mat[x][y-1]) && (okd) )
    {
     if(min[x][y-1] > (min[x][y]+1) )
	{ultim++;
	 c[ultim][0]=x;
	 c[ultim][1]=y-1;

	 min[x][y-1]=min[x][y]+1;
	 div[x][y-1]=div[x][y]*mat[x][y-1];

	 if( (x==fx) && ((y-1)==fy) ) ok=1;
	}

    }

  if( (mat[x][y-1]) && (!okd) )
    {
     if( ( (div[x][y]*mat[x][y-1]) %k)==0 )
	{ultim++;
	 c[ultim][0]=x;
	 c[ultim][1]=y-1;

	 min[x][y-1]=min[x][y]+1;
	 div[x][y-1]=div[x][y]*mat[x][y-1];

	 okd=1;
	}
	else
	   {
	   // if( (k%mat[x][y-1])==0 )
	      if(min[x][y-1] > (min[x][y]+1) )
		{ultim++;
		 c[ultim][0]=x;
		 c[ultim][1]=y-1;

		 min[x][y-1]=min[x][y]+1;
		 div[x][y-1]=div[x][y]*mat[x][y-1];

	     //	 okd=1;
		}

	   }

    }


  prim++;
  if( ok && okd ) ddo=1;
}


g<<min[fx][fy]<<'\n';

g.close();
return 0;
}