Cod sursa(job #256503)

Utilizator vlad_DVlad Dumitriu vlad_D Data 11 februarie 2009 20:40:15
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
using namespace std;

int N, M, K;
int sx, sy, fx, fy;
int harta[55][55];
int S[55][55][1024];

int di[] = {-1, 1, 0, 0};
int dj[] = {0, 0, -1, 1};
vector<int> buni;
int tataia[12012];
int baza = 13000;
int main() {
	ifstream fin("kdrum.in");
	ofstream fout("kdrum.out");
	
	//read the data
	fin >> N >> M >> K;
	fin >> sx >> sy >> fx >> fy;
	int cont = 0;
	for (int i = 1; i <= K; ++i) if (K % i == 0) buni.push_back(i), tataia[i] = cont, ++cont;
	cont--;	
	for (int i = 1; i <= N; ++i)
		for (int j  = 1; j <= M; ++j) fin >> harta[i][j];
	
	//im cool
	S[sx][sy][tataia[ __gcd(K, harta[sx][sy])]] = 1;
	queue<pair<int, int> > Q;
	Q.push(make_pair(sx*100 + sy, tataia[__gcd(K, harta[sx][sy])]));
	int solution = -1;
	while (!Q.empty()) {
		pair<int, int> state = Q.front(); Q.pop();
		
		int px = state.first/100, py = state.first % 100;
		int steps = S[px][py][state.second];
		if (buni[state.second] == K && px == fx && py == fy) {solution = steps; break;}
		//deplaseaza
		for (int d = 0; d < 4; ++d) {
			int nx = di[d] +px;
			int ny = dj[d] + py;
			if (harta[nx][ny] == 0) continue;
			int prod = tataia[__gcd(buni[state.second] * harta[nx][ny], K)];
			if (buni[prod]== K && nx == fx && ny == fy) {solution = steps + 1; break;}
			if (S[nx][ny][prod]) continue;	
			S[nx][ny][prod] = steps + 1;
			Q.push(make_pair(nx*100 + ny, prod));
			}
		if (solution != -1) break;
		}
	fout << solution << '\n';
	fout.close();
	}