Cod sursa(job #654104)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 29 decembrie 2011 16:16:14
Problema Kdrum Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>
#include<queue>
using namespace std;

struct celula{int x, y, lng, factor;};
int map[51][51], dist[51][51][12001], K, N, M;
queue <celula> q;

int CMMDC(int a, int b){
	int r = a % b;
	while (r != 0)	a = b, b = r, r = a % b;
	return b;
}

int main(){
	freopen("kdrum.in", "r", stdin), freopen("kdrum.out", "w", stdout);
	int x1, y1, x2, y2, i, j, p, x, y, x0, y0, factor0, lng, factor;
	int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
	scanf("%d %d %d %d %d %d %d", &N, &M, &K, &x1, &y1, &x2, &y2);
	
	for (i = 1; i <= N; i++)
		for (j = 1; j <= M; j++) scanf("%d", &map[i][j]); 
	
	for (i = 1; i <= N; i++)
		for (j = 1; j <= M; j++) 
			for (p = 1; p <= K; p++) dist[i][j][p] = 0xfffffff;
	
	//dist[x][y][factor] = lungimea minima a distlor care pana la K mai au nevoie de factor
	//in produs	si se incheie pe poz x,y
	
	q.push((celula){x1, y1, 1, K / CMMDC(K, map[x1][y1])});
	while(!q.empty()){
		x0 = q.front().x, y0 = q.front().y, factor0 = q.front().factor, lng = q.front().lng + 1;
		q.pop();
		
		for (i = 0; i < 4; i++){
			x = x0 + dx[i], y = y0 + dy[i];			
			if (0 < x && x <= N && 0 < y && y <= M && map[x][y]){
				factor = factor0 / CMMDC(factor0, map[x][y]);
				
				if (lng < dist[x][y][factor]){
						dist[x][y][factor] = lng;
						q.push((celula){x, y, lng, factor});
				}
			}
		}
	}
	
	printf("%d\n", dist[x2][y2][1]);
	return 0;
}