Cod sursa(job #311992)

Utilizator tvladTataranu Vlad tvlad Data 4 mai 2009 21:07:49
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

struct punct {
	int x, y, v;
	punct() {}
	punct ( int X, int Y, int V ) { x = X; y = Y; v = V; }
};

const int N_MAX = 50;
const int K_MAX = 12000;
const int DIV_MAX = 128;
const int ND = 4;
const punct D[ND] = { punct(1,0,0), punct(0,-1,0), punct(-1,0,0), punct(0,1,0) };

int n,m,k;
int a[N_MAX][N_MAX];
int d[DIV_MAX][N_MAX][N_MAX];
vector<int> divs;
int pdiv[K_MAX+1];
punct st,en;

void divizori() {
	for (int i = 1; i <= k; ++i) {
		if (k % i == 0) {
			pdiv[i] = divs.size();
			divs.push_back(i);
		}
	}
}

inline int cmmdc ( int a, int b ) {
	if (b == 0)
		return a; else
		return cmmdc(b,a%b);
}

int bf() {
	divizori();
	queue<punct> q;
	d[pdiv[a[st.x][st.y]]][st.x][st.y] = 1;
	for (q.push(punct(st.x,st.y,a[st.x][st.y])); !q.empty(); q.pop()) {
		for (int i = 0; i < ND; ++i) {
			punct next(q.front().x + D[i].x, q.front().y + D[i].y, 0);
			if (0 <= next.x && next.x < n && 0 <= next.y && next.y < m && a[next.x][next.y] && !d[pdiv[next.v = cmmdc(q.front().v * a[next.x][next.y], k)]][next.x][next.y]) {
				q.push(next);
				d[pdiv[next.v]][next.x][next.y] = d[pdiv[q.front().v]][q.front().x][q.front().y] + 1;
			}
		}
	}
	return d[divs.size()-1][en.x][en.y];
}

int main() {
	freopen("kdrum.in","rt",stdin);
	freopen("kdrum.out","wt",stdout);
	scanf("%d %d %d",&n,&m,&k);
	scanf("%d %d %d %d",&st.x,&st.y,&en.x,&en.y);
	--st.x; --st.y; --en.x; --en.y;
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < m; ++j)
			scanf("%d",&a[i][j]);
	printf("%d\n",bf());
	return 0;
}