Cod sursa(job #254253)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 7 februarie 2009 03:47:33
Problema Kdrum Scor Ascuns
Compilator cpp Status done
Runda Marime 1.76 kb
#include <stdio.h>

using namespace std;

#define MAXN 60
#define MAXX 180010
#define MAXD 70
#define MAXL 4
#define INF 30000
#define ll long long

int N, M, K, L, NR;
int x1, y1, x2, y2;
int A[MAXN][MAXN];
int D[MAXD];
char Sx[MAXX], Sy[MAXX];
int Sz[MAXX];
short V[MAXN][MAXN][MAXD];
const int dirx[MAXD] = {-1, 1, 0, 0};
const int diry[MAXD] = {0, 0, -1, 1};

inline int GCD(int A, int B)
{
	while (B)
	{
		int aux = A%B;
		A = B;
		B = aux;
	}

	return int(A);
}

void dcmp(int K)
{
	int i;

	for (i = 1; i*i <= K; i++)
		if (K % i == 0) D[++NR] = i;

	for (i = NR - (D[NR]*D[NR]==K); i>0; i--) D[++NR] = K / D[i];
}

inline int search(int X)
{
	int i;

	for (i = 1; i <= NR; i++)
		if (X == D[i]) return i;

	return 1;
}

void BFS(int x1, int y1, int x2, int y2)
{
	int i, j, k, cx, cy, newd;
	
	for (i = 1; i <= N; i++)
		for (j = 1; j <= M; j++)
			for (k = 1; k <= NR; k++) V[i][j][k] = INF;

	L = 1;
	Sx[L] = x1, Sy[L] = y1, Sz[L] = search(1);
	V[x1][y1][search(1)] = 1;

	for (i = 1; i <= L; i++)
		for (j = 0; j < MAXD; j++)
		{
			cx = Sx[i] + dirx[j];
			cy = Sy[i] + diry[j];

			if (cx>0 && cx<=N && cy>0 && cy<=M && A[cx][cy])
			{
				newd = search( GCD(K, 1LL * D[Sz[i]] * A[cx][cy]) );

				if (V[int(Sx[i])][int(Sy[i])][Sz[i]] + 1 < V[cx][cy][newd])
				{
					V[cx][cy][newd] = V[int(Sx[i])][int(Sy[i])][Sz[i]] + 1;
					L++;
					Sx[L] = cx, Sy[L] = cy, Sz[L] = newd;
					if (Sx[L] == x2 && Sy[L] == y2 && Sz[L] == K) return;
				}
			}
		}
}

int main()
{
	freopen("kdrum.in", "r", stdin);
	freopen("kdrum.out", "w", stdout);

	int i, j;

	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]);

	dcmp(K);

	BFS(x1, y1, x2, y2);

	printf("%d\n", V[x2][y2][search(K)]);

	return 0;
}