Pagini recente » Cod sursa (job #1860180) | Cod sursa (job #18964) | Cod sursa (job #2005153) | Cod sursa (job #2382139) | Cod sursa (job #2631831)
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
using namespace std;
ifstream fin ("kdrum.in");
ofstream fout ("kdrum.out");
struct nod {
int x, y, d;
};
int dl[4] = {0, 0, -1, 1};
int dc[4] = {1, -1, 0, 0};
int gcd (int a, int b) {
while (b) {
int r = a % b;
a = b;
b = r;
}
return a;
}
int n, m, k, dp[52][52][102], nrd[102], f[12002], v[52][52], nr, x1, y7, x2, y2;
int main()
{
fin >> n >> m >> k;
fin >> x1 >> y7 >> x2 >> y2;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
fin >> v[i][j];
for (int i = 1; i <= k; i++) {
if (k % i == 0) {
nrd[++nr] = i;
f[i] = nr;
}
}
queue<nod>q;
q.push({x1, y7, f[__gcd(v[x1][y7], k)]});
dp[x1][y7][f[__gcd(v[x1][y7], k)]] = 1;
while (!q.empty()) {
int x = q.front().x;
int y = q.front().y;
int d = q.front().d;
q.pop();
for (int i = 0; i < 4; i++) {
int xx = x + dl[i];
int yy = y + dc[i];
if (v[xx][yy] != 0) {
int poz = f[nrd[d] * __gcd(k / nrd[d], v[xx][yy])];
if (dp[xx][yy][poz] == 0) {
dp[xx][yy][poz] = dp[x][y][d] + 1;
q.push({xx, yy, poz});
if (xx == x2 && yy == y2 && poz == nr) {
fout << dp[x2][y2][nr];
return 0;
}
}
}
}
}
return 0;
}