Pagini recente » Cod sursa (job #320716) | Cod sursa (job #769127) | Cod sursa (job #679390) | Cod sursa (job #819905) | Cod sursa (job #256610)
Cod sursa(job #256610)
#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][124];
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();
}