Pagini recente » Cod sursa (job #2633764) | Cod sursa (job #2751049) | Cod sursa (job #2847749) | Cod sursa (job #261729)
Cod sursa(job #261729)
#include <cstdio>
const int MAX_N = 55;
const int MAX_D = 100;
const int MAX_K = 12001;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
int n, m, k, z, div;
int d[MAX_D], a[MAX_N][MAX_N], b[MAX_N][MAX_N][MAX_D], p[MAX_K];
struct point {
int x, y, r;
} c[MAX_N * MAX_N * MAX_D];
int cmmdc(int a, int b)
{
int r;
while (b)
{
r = a % b;
a = b;
b = r;
}
return a;
}
int main()
{
int i, j, x1, y1, x2, y2;
freopen("kdrum.in", "r", stdin);
freopen("kdrum.out", "w", stdout);
scanf("%d%d%d", &n, &m, &k);
for (i = 1; i <= k; i++)
if (k % i == 0) d[p[i] = ++div] = i;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
for (i = 1; i <= n; i++)
for (j = 1; j <= m; scanf("%d", &a[i][j]), j++)
b[x1][y1][p[k / cmmdc(k, a[x1][y1])]] = 1;
z = 1;
c[1].x = x1;
c[1].y = y1;
c[1].r = k / cmmdc(k, a[x1][y1]);
for (i = 1; i <= z; ++i)
{
for (int dir = 0; dir < 4; dir++)
{
int newx = c[i].x + dx[dir];
int newy = c[i].y + dy[dir];
if (newx > 0 && newx <= n && newy > 0 && newy <= m && a[newx][newy] != 0)
{
int r = c[i].r / cmmdc(a[newx][newy], c[i].r);
if (b[c[i].x][c[i].y][c[i].r] + 1 < b[newx][newy][r] || (!b[newx][newy][r]))
{
b[newx][newy][r] = b[c[i].x][c[i].y][c[i].r] + 1;
c[++z].x = newx;
c[z].y = newy;
c[z].r = r;
}
}
}
}
printf("%d\n", b[x2][y2][1] + 1);
}