Cod sursa(job #254358)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 7 februarie 2009 11:28:22
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 2.27 kb
#include <cstdio>
#include <cstdlib>
#include <bitset>
#include <queue>

#define pii pair< pair<int,int>, pair<int,int> >
#define pi pair<int,int> 
#define mp make_pair
#define ff first
#define ss second

using namespace std;

const int maxK = 12001;
const int maxN = 51;
const int oo = 10000000;
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};

pi start, finish;
queue< pi > P, Q;
int N, M, K;
int A[maxN][maxN], B[maxN][maxN], C[maxN][maxN];

bitset<maxK> Z;

void baga_marfa(){
	int i, j;

	for (i = 2; i <= K; ++i)
		if (K % i == 0)	Z[i] = true;
		else			Z[i] = false;
}

void edit(){
	int i, j;
	for (i = 1; i <= N; ++i)
		for (j = 1; j <= M; ++j){	
			if (A[i][j] == 0)		A[i][j] = -1;
			else if (Z[A[i][j]] == 0)	A[i][j] = 1;
			B[i][j] = oo;
		}
	for (i = 0; i <= N + 1 || i <= M + 1; ++i)
		A[0][i] = A[N + 1][i] = A[i][0] = A[i][M + 1] = -1;
}

void go(){
	pi now1, now2, next1, next2;
	int i, k;
	
	P.push(start), Q.push(mp(A[start.ff][start.ss], 1)); 
	B[start.ff][start.ss] = 1;
	
	while (Q.empty() == false && P.empty() == false){
		now1 = P.front(), now2 = Q.front(), P.pop(), Q.pop();
		//fprintf(stderr, "%d %d %d %d\n", now1.ff, now1.ss, now2.ff, now2.ss);
		if (P.front() == finish && Q.front().ss == 0)
			return;
		for (k = 0; k < 4; ++k){
			next1 = mp(now1.ff + dx[k], now1.ss + dy[k]);
			if (A[next1.ff][next1.ss] != -1 && (B[next1.ff][next1.ss] > B[now1.ff][now1.ss] + 1 || (B[next1.ff][next1.ss] < (now2.ff * A[next1.ff][next1.ss]) % K))){
				next2 = mp( (now2.ff * A[next1.ff][next1.ss]) % K, now2.ss + 1);
				B[next1.ff][next1.ss] = now2.ss + 1;
				P.push(next1);
				Q.push(next2);
			}
		}
	}
}
	
int main(){
	int i, j;
	
	freopen("kdrum.in", "r", stdin);
	freopen("kdrum.out", "w", stdout);
	
	scanf("%d%d%d", &N, &M, &K);
	
	scanf("%d%d%d%d", &start.first, &start.second, &finish.first, &finish.second);
	
	for (i = 1; i <= N; ++i)
		for (j = 1; j <= M; ++j){
			scanf("%d", &A[i][j]);
			if (A[i][j] % K == 0 && A[i][j] != 0)
				A[i][j] = K;
			else
				A[i][j] = A[i][j] % K;
		}
	
	baga_marfa();
	edit();
	/*for (i = 1; i <= N; ++i){
		for (j = 1; j <= M; ++j)
			printf("%d ", A[i][j]);
		puts("");
	}*/
	go();
	//puts("");
	/*for (i = 1; i <= N; ++i){
		for (j = 1; j <= M; ++j)
			printf("%d ", B[i][j]);
		puts("");
	}*/
	
	printf("%d\n", B[finish.ff][finish.ss]);
}