Cod sursa(job #371726)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 6 decembrie 2009 14:03:54
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>
#define inf 1000000000
struct queue
{
	int x,y,z;
};
int n,m,k,nr,x1,y1,x2,y2,v[52][52],d[52][52][80],div[80],h[12005];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
queue q[200000];

void desc()
{
	int i;
	for(i=1;i<=k;i++)
		if(k%i==0)
			div[++nr]=i;
	for(i=1;i<=nr;i++)
		h[div[i]]=i;
}

int cmmdc(int x, int y)
{
	int r;
	while(y)
	{
		r=x%y;
		x=y;
		y=r;
	}
	return x;
}

void bfs()
{
	int p,u,i,cx,cy,cd;
	p=u=1;
	q[1].x=x1;
	q[1].y=y1;
	q[1].z=1;
	d[x1][y1][1]=1;
	while(p<=u)
	{
		for(i=0;i<=3;i++)
		{
			cx=q[p].x+dx[i];
			cy=q[p].y+dy[i];
			if(v[cx][cy])
			{
				cd=h[cmmdc(k,v[cx][cy]*div[q[p].z])];
				if(d[q[p].x][q[p].y][q[p].z]+1<d[cx][cy][cd])
				{
					d[cx][cy][cd]=d[q[p].x][q[p].y][q[p].z]+1;
					++u;
					q[u].x=cx;
					q[u].y=cy;
					q[u].z=cd;
				}
			}
		}
		p++;
	}
}

int main()
{
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
	scanf("%d%d%d%d%d%d%d",&n,&m,&k,&x1,&y1,&x2,&y2);
	desc();
	int i,j,ii;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
		{
			scanf("%d",&v[i][j]);
			for(ii=1;ii<=nr;ii++)
				d[i][j][ii]=inf;
		}
	bfs();
	printf("%d\n",d[x2][y2][nr]);
	return 0;
}