Cod sursa(job #324332)

Utilizator FlorianFlorian Marcu Florian Data 15 iunie 2009 19:19:53
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
using namespace std;
#include<cstdio>
#include<queue>
#define mk make_pair
#define s second
#define f first
int N,M,K,x1,x2,y1,y2;
int dv[200],div_len, poz[12002];
int a[52][52], d[52][52][200];
queue<pair<pair<int,int>,int> >Q;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
inline int cmmdc(int a, int b)
{
	int r = a%b;
	while(r)
	{
		a=b;
		b=r;
		r = a%b;
	}
	return b;
}
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);
	int i,j,x,y,z,nx,ny,t;
	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) 
		{
			dv[++div_len] = i;
			poz[i] = div_len;
		}
	Q.push(mk(mk(x1,y1), poz[cmmdc(K, a[x1][y1])]));
	d[x1][y1][Q.front().s] = 1;
	for(;!Q.empty();Q.pop())
	{
		x = Q.front().f.f; y = Q.front().f.s; z = Q.front().s;
		for(i=0;i<4;++i)
		{
			nx = x + dx[i]; ny = y + dy[i];
			if(nx < 1 || nx > N || ny<1 || ny>M || !a[nx][ny]) continue;
			t = poz[ cmmdc(K, a[nx][ny] * dv[z]) ];
			if(!d[nx][ny][t] || d[x][y][z] + 1 < d[nx][ny][t])
			{
				d[nx][ny][t] = d[x][y][z] + 1;
				Q.push(mk(mk(nx,ny),t));
			}
		}
	}
	printf("%d\n",d[x2][y2][div_len]);
	return 0;
}