Pagini recente » Cod sursa (job #1153470) | Cod sursa (job #263215) | Cod sursa (job #130555) | Cod sursa (job #1442975) | Cod sursa (job #1920135)
#include <bits/stdc++.h>
#define maxN 52
#define maxM 52
#define maxK 1202
#define inf 1000000000
using namespace std;
FILE *fin = freopen("kdrum.in", "r", stdin);
FILE *fout = freopen("kdrum.out", "w", stdout);
/* -------------------- */
int n, m, k, a[maxN][maxN];
struct Cell
{
int x, y, d;
} b, e;
/* -------------------- */
int dp[maxN][maxN][maxK];
queue < Cell > q;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
/* -------------------- */
int gcd(int x, int y)
{
int r = x % y;
while (r)
{
x = y;
y = r;
r = x % y;
}
return y;
}
void read()
{
scanf("%d %d %d", &n, &m, &k);
scanf("%d%d%d%d", &b.x, &b.y, &e.x, &e.y);
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= m; ++ j)
scanf("%d", &a[i][j]);
}
bool ok(int x, int y)
{
return (x > 0 && y > 0 && x <= n && y <= m && a[x][y]);
}
void init()
{
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= m; ++ j)
for (int d = 1; d <= k; ++ d)
dp[i][j][d] = inf;
}
void solve()
{
int d = gcd(k, a[b.x][b.y]);
init();
dp[b.x][b.y][d] = 1;
q.push({b.x, b.y, d});
while (!q.empty())
{
Cell nod = q.front();
q.pop();
for (int d = 0; d < 4; ++ d)
if (ok(nod.x + dx[d], nod.y + dy[d]))
{
int g = gcd(a[nod.x + dx[d]][nod.y + dy[d]] * nod.d, k);
if (dp[nod.x + dx[d]][nod.y + dy[d]][g] > dp[nod.x][nod.y][nod.d] + 1)
{
dp[nod.x + dx[d]][nod.y + dy[d]][g] = dp[nod.x][nod.y][nod.d] + 1;
q.push({nod.x + dx[d], nod.y + dy[d], g});
}
}
}
}
void write()
{
printf("%d\n", dp[e.x][e.y][k]);
}
int main()
{
read();
solve();
write();
return 0;
}