Cod sursa(job #260003)

Utilizator raduzerRadu Zernoveanu raduzer Data 16 februarie 2009 12:31:55
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>

const int MAX_N = 55;
const int MAX_D = 100;
const int MAX_K = 12001;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

int n, m, k, z, div;
int d[MAX_D], a[MAX_N][MAX_N], b[MAX_N][MAX_N][MAX_D], p[MAX_K];

struct point {
	int x, y, r;
} c[MAX_N * MAX_N];

int cmmdc(int a, int b) 
{
	int r;
	while (b) 
	{
		r = a % b;
		a = b;
		b = r;
	}
	
	return a;
}

int main() 
{
	int i, j, x1, y1, x2, y2;
	freopen("kdrum.in", "r", stdin);
	freopen("kdrum.out", "w", stdout);
	
	scanf("%d%d%d", &n, &m, &k);
	
	for (i = 1; i <= k; i++)
		if (k % i == 0) d[p[i] = ++div] = i;
	
	scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
	
	for (i = 1; i <= n; i++)
		for (j = 1; j <= m; scanf("%d", &a[i][j]), j++)
		
	b[x1][y1][p[k / cmmdc(k, a[x1][y1])]] = 1;
				
	z = 1;
	c[1].x = x1; 
	c[1].y = y1; 
	c[1].r = p[k / cmmdc(k, a[x1][y1])];
	
	for (i = 1; i <= z; ++i)
	{
		for (int dir = 0; dir < 4; dir++) 
		{
			int newx = c[i].x + dx[dir];
			int newy = c[i].y + dy[dir];
			if (newx > 0 && newx <= n && newy > 0 && newy <= m && a[newx][newy] != 0) 
			{
				int r = p[d[c[i].r] / cmmdc(a[newx][newy], d[c[i].r])];
				
				if (b[c[i].x][c[i].y][c[i].r] + 1 < b[newx][newy][r] || (!b[newx][newy][r])) 
				{
					b[newx][newy][r] = b[c[i].x][c[i].y][c[i].r] + 1;
					c[++z].x = newx; 
					c[z].y = newy; 
					c[z].r = r;
				}
			}
		}
	}
	printf("%d\n", b[x2][y2][1]);
}