Pagini recente » Cod sursa (job #1066214) | Cod sursa (job #2602345) | Cod sursa (job #3130086)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
int n, m, k, a[51][51];
int xs, ys, xf, yf;
map <pair<int, int>, int> M;
inline int cmmdc(long long a, int b = k) {
while (b) {
int r = a % b;
a = b;
b = r;
}
return a;
}
struct nod {
int i, j;
int nr, dst;
bool operator<(const nod &aux) const {
if (dst == aux.dst)
return nr < aux.nr;
return dst > aux.dst;
}
};
priority_queue<nod> Q;
int d1[] = {-1, 0, 1, 0};
int d2[] = {0, 1, 0, -1};
inline bool in(int i, int j) {
return i >= 1 && i <= n && j >= 1 && j <= m;
}
int main() {
fin >> n >> m >> k;
fin >> xs >> ys >> xf >> yf;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
fin >> a[i][j];
Q.push({xs, ys, cmmdc(a[xs][ys], k), 1});
M[{xs, ys}] = cmmdc(a[xs][ys], k);
while (!Q.empty()) {
int i = Q.top().i;
int j = Q.top().j;
int nr = Q.top().nr;
int dst = Q.top().dst;
Q.pop();
if (i == xf && j == yf) {
fout << dst;
return 0;
}
for (int l = 0; l < 4; l++) {
int x = i + d1[l];
int y = j + d2[l];
int aux = cmmdc(1LL * nr * a[x][y]);
if (in(x, y) && M[{x, y}] != aux)
Q.push({x, y, aux, dst + 1}), M[{x, y}] = aux;
}
}
return 0;
}