Pagini recente » Cod sursa (job #2027672) | Cod sursa (job #2437291) | Cod sursa (job #96022) | Cod sursa (job #139329) | Cod sursa (job #254396)
Cod sursa(job #254396)
#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;
}