Pagini recente » Cod sursa (job #1478414) | Cod sursa (job #936942) | Cod sursa (job #2630206) | Cod sursa (job #1479352) | Cod sursa (job #3130082)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("number.in");
ofstream fout("number.out");
int n, m, k, a[51][51];
int xs, ys, xf, yf;
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});
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];
if (in(x, y))
Q.push({x, y, cmmdc(1LL * nr * a[x][y]), dst + 1});
}
}
return 0;
}