Pagini recente » Cod sursa (job #995554) | Cod sursa (job #3139476) | Cod sursa (job #1908356) | Cod sursa (job #1405877) | Cod sursa (job #1093010)
/*
~Keep It Simple!~
*/
#include<stdio.h>
#include<string.h>
#include<list>
using namespace std;
#define NMax 52
#define inf 20000
int N,M,k,x1,x2,yy1,y2,A[NMax][NMax],idx[12002],Lmin[NMax][NMax][305];
int divs[6000],nrd;
struct node { int x,y,idx; };
list< node > S;
bool viz[NMax][NMax];
int xi[] = {1,0,-1,0};
int yi[] = {0,-1,0,1};
int cmmdc(int a, int b)
{
if(!b) return a;
return cmmdc(b,a%b);
}
void InitDiv()
{
for(int i = 1; i <= k/2; i++)
if( k%i == 0 )
{
divs[++nrd] = i;
idx[i] = nrd;
}
divs[++nrd] = k;
idx[k] = nrd;
}
void BFS()
{
S.clear();
node T;
T.x = x1; T.y = yy1; T.idx = cmmdc(A[x1][yy1],k);
S.push_back(T);
viz[x1][yy1] = 1;
memset(Lmin,inf,sizeof(Lmin));
Lmin[T.x][T.y][T.idx] = 1;
while(S.size())
{
node nod = S.front();
S.pop_front();
viz[nod.x][nod.y] = 1;
for(int i = 0; i<4; i++)
{
int xs = nod.x+xi[i];
int ys = nod.y+yi[i];
int p = idx[cmmdc( A[xs][ys] * divs[nod.idx] ,k)];
if(A[xs][ys] && Lmin[nod.x][nod.y][nod.idx] + 1 < Lmin[xs][ys][p])
{
Lmin[xs][ys][p] = Lmin[nod.x][nod.y][nod.idx] + 1;
node aux;
aux.x = xs; aux.y = ys; aux.idx = p;
S.push_back(aux);
}
}
}
}
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,&yy1,&x2,&y2);
for(int i = 1; i <= N; i++)
for(int j = 1; j <= M; j++)
scanf("%d",&A[i][j]);
InitDiv();
BFS();
printf("%d",Lmin[x2][y2][nrd]);
}