Pagini recente » Cod sursa (job #1968537) | Cod sursa (job #932246) | Cod sursa (job #1793477) | Cod sursa (job #613628) | Cod sursa (job #994799)
Cod sursa(job #994799)
#include<fstream>
#define ll long long
#define INF 2000000000
using namespace std;
ifstream f("kdrum.in"); ofstream g("kdrum.out");
int n,m,k,nrd,xp,yp,xf,yf;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int ord[12001],a[52][52],dist[61][61][101];
struct art {int x,y,z;} q[300005];
int cmmdc(ll a,ll b)
{ while(b)
{ll r=a%b; a=b; b=r;}
return a;
}
int main ()
{ int i,j,z,px,py,xx,yy,p,u,SD,D,w;
f>>n>>m>>k>>xp>>yp>>xf>>yf;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f>>a[i][j];
nrd=0;
for(i=1;i<=k;i++)
if(!(k%i))
ord[i]=++nrd;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
for(z=1;z<=nrd;z++)
dist[i][j][z]=INF;
q[1].x=xp; q[1].y=yp; q[1].z=1;
p=u=w=1; dist[xp][yp][1]=1;
while(w)
{ px=q[p].x; py=q[p].y; D=q[p].z;
for(i=0;i<4 && w;i++)
{ xx=px+dx[i]; yy=py+dy[i];
if(a[xx][yy])
{ SD=cmmdc((ll)k,(ll)D*a[xx][yy]);
if(dist[px][py][ord[D]] + 1 < dist[xx][yy][ord[SD]])
{ dist[xx][yy][ord[SD]]=dist[px][py][ord[D]] + 1;
q[++u].x=xx; q[u].y=yy; q[u].z=SD;
if(xx==xf && yy==yf && SD==k) w=0;
}
}
}
p++;
}
g<<dist[xf][yf][ord[k]]<<'\n'; g.close(); return 0;
}