Pagini recente » Cod sursa (job #404849) | Cod sursa (job #1060192) | Cod sursa (job #2277262) | Cod sursa (job #1021718) | Cod sursa (job #261683)
Cod sursa(job #261683)
#include <stdio.h>
#define MAX_N 55
#define MAX_D 710
int i, j, n, m, k, x1, y1, x2, y2, st, dr;
int d[MAX_D];
int a[MAX_N][MAX_N];
int fol[MAX_N][MAX_N][MAX_D];
int dir[4] = {-1, 1, 0, 0};
struct punct {
int x;
int y;
int val;
} v[MAX_N * MAX_N * MAX_D];
void cit() {
freopen("kdrum.in", "r", stdin);
freopen("kdrum.out", "w", stdout);
scanf("%d %d %d", &n, &m, &k);
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
}
void calc_div() {
for (i = 1; i <= k; i++)
if (!(k % i)) d[++d[0]] = i;
}
int cmmdc(long long x, int k) {
long long a = x, b = k, r = 0;
while (a % b != 0) {
r = a % b;
a = b;
b = r;
}
return (int) b;
}
int numar(int p, int q) {
long long x = p * q;
return cmmdc(x, k);
}
void funct_lee(int x, int y, int val) {
for (int i = 0; i < 4; i++) {
int p = x + dir[i];
int q = y + dir[3 - i];
int divi = numar(val, a[p][q]);
if (a[p][q] && p && q && p <= n && q <= m && fol[p][q][divi] == 0) {
v[++dr].x = p;
v[dr].y = q;
v[dr].val = divi;
fol[p][q][divi] = fol[x][y][val] + 1;
}
}
}
void solve() {
calc_div();
st = 0; dr = 1;
fol[x1][y1][1] = 1;
v[1].x = x1; v[1].y = y1; v[1].val = cmmdc(a[x1][y1], k);
while (st < dr) {
st++;
funct_lee(v[st].x, v[st].y, v[st].val);
}
printf("%d\n", fol[x2][y2][k]);
}
int main() {
cit();
solve();
return 0;
}