Cod sursa(job #254684)

Utilizator CezarMocanCezar Mocan CezarMocan Data 7 februarie 2009 13:43:40
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.6 kb
#include <cstdio>
#define maxn 53
#define inf 2000000000

using namespace std;

struct elem {
	int x, y, r;
};

int dl[4] = {0, 0, 1, -1};
int dc[4] = {1, -1, 0, 0};

int n, m, k, i, j, nrd, p, u, x1, x2, y1, y2, q, st, d, lnou, cnou, rnou, lc, cc, rc;
int dv[100], v[maxn][maxn], x[maxn][maxn][100], poz[12100];
int cd[100100];
elem c[250000];

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", &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", &v[i][j]);
		
	for (i = 1; i <= k; i++)
		if (k % i == 0) {
			nrd++;
			poz[i] = nrd;
			dv[nrd] = i;
		}
	
	for (i = 1; i < maxn; i++)
		for (j = 1; j < maxn; j++)
			for (q = 1; q < 100; q++)
				x[i][j][q] = inf;
			
	if (v[x1][y1] == 0)
		st = 1;
	else
		st = poz[k / cmmdc(v[x1][y1], k)]; 
	x[x1][y1][st] = 1;
				
	p = u = 1;
	c[1].x = x1; c[1].y = y1; c[1].r = st;
	
	while (p <= u) {
		lc = c[p].x; cc = c[p].y; rc = c[p].r;
		for (d = 0; d < 4; d++) {
			lnou = lc + dl[d];
			cnou = cc + dc[d];
			if (lnou > 0 && lnou <= n && cnou > 0 && cnou <= m && v[lnou][cnou] != 0) {
				rnou = poz[dv[rc] / cmmdc(v[lnou][cnou], dv[rc])];
				if (x[lc][cc][rc] + 1 < x[lnou][cnou][rnou]) {
					x[lnou][cnou][rnou] = x[lc][cc][rc] + 1;
					u++;
					c[u].x = lnou; c[u].y = cnou; c[u].r = rnou;
				}
			}
		}
		p++;
	}
	
	printf("%d\n", x[x2][y2][1]);
	
	
		
	return 0;
}