Pagini recente » Cod sursa (job #33366) | Cod sursa (job #1301237) | Cod sursa (job #2293104) | Cod sursa (job #329848) | Cod sursa (job #868797)
Cod sursa(job #868797)
#include<stdio.h>
#define NMAX 64
#define MAXD 110
#define KMAX 12020
#define HUGE 275000
#define inf 0x3f3f3f3f
int A[NMAX][NMAX];
int M[NMAX][NMAX][MAXD];
int P[MAXD],NR[KMAX];
typedef struct coada{int x,y,d;};
coada L[HUGE];
const int dx[]={0,0,-1,1};
const int dy[]={-1,1,0,0};
int N,m1,K,x1,y1,x2,y2;
int cmmdc(int a,int b)
{
int r=a%b;
while(r){a=b;b=r;r=a%b;}
return b;
}
void BF()
{
int i;
int inc,sf;
inc=sf=1;
L[ 1 ].x = x1;
L[ 1 ].y = y1;
L[ 1 ].d = NR[ K / cmmdc( K, A[x1][y1] ) ];
M[ x1 ][ y1 ][ L[1].d ]=1;
int a1,a2,a3,s;
int b1,b2,b3;
while( inc<=sf )
{
a1=L[inc].x;
a2=L[inc].y;
a3=L[inc].d;
s=M[a1][a2][a3]+1;
inc++;
for(i=0; i<4; ++i)
{
b1=a1+dx[i];
b2=a2+dy[i];
if(A[b1][b2])
{
b3= NR[ P[a3]/cmmdc( P[a3], A[b1][b2] )];
if( M[b1][b2][b3] > s )
{
M[b1][b2][b3]=s;
L[++sf].x=b1;
L[sf].y=b2;
L[sf].d=b3;
}
}
}
}
printf("%d\n",M[x2][y2][1]);
}
int main()
{
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
scanf("%d%d%d\n",&N,&m1,&K);
scanf("%d%d%d%d\n",&x1,&y1,&x2,&y2);
int i,j;
for(i=1; i<=N; ++i)
for(j=1; j<=m1; ++j)
scanf("%d",&A[i][j]);
int k;
for(i=1; i<=N; ++i)
for(j=1; j<=m1; ++j)
for(k=1; k<=MAXD; ++k)
M[i][j][k]=inf;
int incr=0;
for(i=1; i<=K; ++i)
{
if( K%i==0 )
{
++incr;
NR[i]=incr;
P[incr]=i;
}
}
BF();
return 0;
}