Pagini recente » Cod sursa (job #1859513) | Cod sursa (job #1989589) | Cod sursa (job #1026006) | Cod sursa (job #2631468) | Cod sursa (job #256494)
Cod sursa(job #256494)
#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];
map<pair<int, int>, int> MAP;
int di[] = {-1, 1, 0, 0};
int dj[] = {0, 0, -1, 1};
int main() {
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
//read the data
fin >> N >> M >> K;
fin >> sx >> sy >> fx >> fy;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= M; ++j) fin >> harta[i][j];
//im cool
MAP[make_pair(sx*100 + sy,int( __gcd(K, harta[sx][sy])))] = 1;
queue<pair<int, int> > Q;
Q.push(make_pair(sx*100 + sy, __gcd(K, harta[sx][sy])));
int solution = -1;
while (!Q.empty()) {
pair<int, int> state = Q.front(); Q.pop();
int steps = MAP[state];
int px = state.first/100, py = state.first % 100;
if (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 = __gcd(state.second * harta[nx][ny], K);
if (MAP[make_pair(nx*100 + ny, prod)]) continue;
MAP[make_pair(nx*100 + ny, prod)] = steps + 1;
Q.push(make_pair(nx*100 + ny, prod));
}
}
fout << solution << '\n';
fout.close();
}