Pagini recente » Cod sursa (job #2024771) | Cod sursa (job #1301137) | Cod sursa (job #2105529) | Istoria paginii runda/2010_1/clasament | Cod sursa (job #1110064)
#include<cstdio>
using namespace std;
const int MAX_N = 51 ;
const int MAX_K = 12001 ;
const int MAX_NDIV = 220 ;
int dx[] = {1,0,-1,0} ;
int dy[] = {0,-1,0,1} ;
struct celula {
int x,y,d;
}c[MAX_N*MAX_N*MAX_NDIV];
int n,m,k,x1,x2,y1,y2,i,j,x,y,d,vx,vy;
int a[MAX_N][MAX_N];
int div[MAX_NDIV],v[MAX_K];
int dist[MAX_N][MAX_N][MAX_NDIV];
int ndiv;
int len;
int cmmdc(int a,int b) {
int r;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
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,&y1,&x2,&y2);
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
scanf("%d",&a[i][j]);
for(i=1;i<=k;++i)
if(k%i==0) {
div[++ndiv]=i;
v[i]=ndiv;
}
dist[x1][y1][v[1]]=1;
c[1].x = x1;
c[1].y = y1;
c[1].d = 1;
len = 1;
for(i=1;i<=len;++i) {
x=c[i].x;
y=c[i].y;
d=c[i].d;
for(j=0;j<4;++j) {
vx = x+dx[j];
vy = y+dy[j];
if( vx>=1 && vx<=n && vy>=1 && vy<=m && a[vx][vy]!=0 ) {
int vd=v[cmmdc(a[vx][vy]*div[d],k)];
if(dist[vx][vy][vd]==0) {
len++;
c[len].x=vx;
c[len].y=vy;
c[len].d=vd;
dist[vx][vy][vd]=dist[x][y][d]+1;
}
}
}
}
printf("%d\n",dist[x2][y2][v[k]]);
return 0;
}