Cod sursa(job #607963)

Utilizator cont_de_testeCont Teste cont_de_teste Data 14 august 2011 00:42:02
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
# include <cstdio>
# include <deque>
using namespace std;

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, dvvv;
int d[MAX_D], a[MAX_N][MAX_N], b[MAX_N][MAX_N][MAX_D], p[MAX_K];

struct vec {
	int x, y, r;
	vec () {};
	vec (int xx, int yy, int nrnr) {
	    x = xx, y = yy, r = nrnr;
	}
} ;

deque <vec> c;

int cmmdc (int A, int B) {
    return (B ? cmmdc (B, A % B) : 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] = ++dvvv] = 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;
    c.push_back (vec (x1, y1, p[k / cmmdc(k, a[x1][y1])]));
	/*z = 1;
	c[1].x = x1;
	c[1].y = y1;
	c[1].r = p[k / cmmdc(k, a[x1][y1])];*/

	for (; !c.empty (); c.pop_front ())
	{
		for (int dir = 0; dir < 4; dir++)
		{
			int newx = c.front ().x + dx[dir];
			int newy = c.front ().y + dy[dir];
			if (newx > 0 && newx <= n && newy > 0 && newy <= m && a[newx][newy] != 0)
			{
				int r = p[d[c.front ().r] / cmmdc(a[newx][newy], d[c.front ().r])];

				if (b[c.front ().x][c.front ().y][c.front ().r] + 1 < b[newx][newy][r] || (!b[newx][newy][r]))
				{
					b[newx][newy][r] = b[c.front ().x][c.front ().y][c.front ().r] + 1;
					c.push_back (vec (newx, newy, r));
					/*c[++z].x = newx;
					c[z].y = newy;
					c[z].r = r;*/
				}
			}
		}
	}
	printf("%d\n", b[x2][y2][1]);
}