Cod sursa(job #465130)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 23 iunie 2010 13:08:23
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<stdio.h>
#define ll long long
#define INF 2000000000

int n,m,k,div;
int x1,y1,x2,y2;
int ord[12008];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int dist[61][61][101];
int a[61][61];

struct point 
{
	int x,y,z;
};
point q[300005];
int cmmdc(ll a,ll b)
{ return b ? cmmdc(b,a%b) : a; }	

int main ()
{
	int i,j,z,px,py,sx,sy,inc,sf,SD,D;
	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]);
	div=0;		
	for(i=1;i<=k;i++)
		if(!(k%i))
			ord[i]=++div;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			for(z=1;z<=div;z++)
				dist[i][j][z]=INF;
			
	q[1].x=x1,q[1].y=y1,q[1].z=1;
	inc=sf=1;dist[x1][y1][1]=1;	
	while(inc<=sf)
	{
		px=q[inc].x;
		py=q[inc].y;
		D=q[inc].z;
		for(i=0;i<4;i++)
		{
			sx=px+dx[i];
			sy=py+dy[i];
			if(sx<1 || sx>n || sy<1 || sy>m || !a[sx][sy])	
				continue;
			SD=cmmdc((ll)k,(ll)D*a[sx][sy]);				
			if(dist[px][py][ord[D]] + 1 < dist[sx][sy][ord[SD]])	
			{
				dist[sx][sy][ord[SD]]=dist[px][py][ord[D]] + 1;
				q[++sf].x=sx;
				q[sf].y=sy;
				q[sf].z=SD;
				if(sx==x2 && sy==y2 && SD==k)
				{
					printf("%d\n",dist[sx][sy][ord[k]]);
					return 0;
				}				
			}
		}
		inc++;
	}
	return 0;
}