Cod sursa(job #261686)

Utilizator savimSerban Andrei Stan savim Data 18 februarie 2009 17:44:16
Problema Kdrum Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>

#define MAX_N 55
#define MAX_D 110

int i, j, n, m, k, x1, y1, x2, y2, st, dr;
int d[MAX_D];
int a[MAX_N][MAX_N];
int fol[MAX_N][MAX_N][MAX_D];
int dir[4] = {-1, 1, 0, 0};

struct punct {
	int x;
	int y;
	int val;
} v[MAX_N * MAX_N * MAX_D];

void cit() {
	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]);
}

void calc_div() {
	for (i = 1; i <= k; i++)
		if (!(k % i)) d[++d[0]] = i;
}

int cmmdc(long long x, int k) {
	long long a = x, b = k, r = 0;
	while (a % b != 0) {
		r = a % b;
		a = b;
		b = r;
	}
	return (int) b;
}

int numar(int p, int q) {
	long long x = p * q;

	return cmmdc(x, k);
}

void funct_lee(int x, int y, int val) {
	for (int i = 0; i < 4; i++) {
		int p = x + dir[i];
		int q = y + dir[3 - i];

		int divi = numar(val, a[p][q]);
		if (a[p][q] && p && q && p <= n && q <= m && fol[p][q][divi] == 0) {
			v[++dr].x = p;
			v[dr].y = q;
			v[dr].val = divi;
			fol[p][q][divi] = fol[x][y][val] + 1;
		}
	}
}

void solve() {
	calc_div();

	st = 0; dr = 1;
	fol[x1][y1][1] = 1;
	v[1].x = x1; v[1].y = y1; v[1].val = cmmdc(a[x1][y1], k);
	while (st < dr) {
		st++;
		funct_lee(v[st].x, v[st].y, v[st].val);
	}

	printf("%d\n", fol[x2][y2][k]);
}

int main() {

	cit();
	solve();

	return 0;
}