Pagini recente » Cod sursa (job #613853) | Cod sursa (job #253728) | Cod sursa (job #2381156) | Cod sursa (job #1812629) | Cod sursa (job #633271)
Cod sursa(job #633271)
#include<cstdio>
const int MAX_N = 51 ;
const int MAX_K = 12001 ;
const int MAX_NDIV = 220 ;
const int dx[4]={1,0,-1,0} ;
const int dy[4]={0,-1,0,1} ;
struct celula
{
int x,y,d;
};
int n,m,k,x1,x2,y1,y2;
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;
celula coada[MAX_N*MAX_N*MAX_NDIV];
void divizori()
{
for(int i=1;i<=k;++i)
if(k%i==0)
{
div[++ndiv]=i;
v[i]=ndiv;
}
}
int cmmmdc(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(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
divizori();
dist[x1][y1][v[1]]=1;
coada[1].x = x1;
coada[1].y = y1;
coada[1].d = 1;
len = 1;
for(int i=1;i<=len;++i)
{
int x=coada[i].x;
int y=coada[i].y;
int d=coada[i].d;
for(int j=0;j<4;++j)
{
int vx = x+dx[j];
int vy = y+dy[j];
if( (vx>=1 && vx<=n) && (vy>=1 && vy<=m) && a[vx][vy]!=0 )
{
int vd=v[cmmmdc(a[vx][vy]*div[d],k)];
if(dist[vx][vy][vd]==0)
{
len++;
coada[len].x=vx;
coada[len].y=vy;
coada[len].d=vd;
dist[vx][vy][vd]=dist[x][y][d]+1;
}
}
}
}
printf("%d\n",dist[x2][y2][v[k]]);
return 0;
}