Pagini recente » Cod sursa (job #2574725) | Cod sursa (job #1865576) | Cod sursa (job #2492076) | Cod sursa (job #483359) | Cod sursa (job #1512884)
#include <stdio.h>
#include <queue>
#define MAX_N 50
#define MAX_K 12000
#define MAX_Q (MAX_N * MAX_N * MAX_K)
#define INF 32767
#define NUM_DIR 4
#define OBSTACLE 0
int dir[NUM_DIR][2] = { {-1, 0}, {1, 0}, {0, 1}, {0, -1} };
short a[MAX_N + 2][MAX_N + 2]; // matricea data, bordata cu 0
/* d[i][j][mod] = costum minim de a ajunge in (i, j) cu restul mod */
short d[MAX_N + 2][MAX_N + 2][MAX_K];
typedef struct {
short x, y;
short mod;
} coada;
std::queue <coada> Q;
int main(void) {
FILE *f = fopen("kdrum.in", "r");
short n, m, k, i, j, x, y, mod;
short X, Y, endX, endY, newMod;
fscanf(f, "%hd%hd%hd%hd%hd%hd%hd", &n, &m, &k, &X, &Y, &endX, &endY);
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
fscanf(f, "%hd", &a[i][j]);
for (x = 0; x < k; x++) {
d[i][j][x] = INF;
}
}
}
fclose(f);
newMod = a[X][Y] % k;
Q.push({X, Y, newMod});
d[X][Y][newMod] = 1;
do {
x = Q.front().x;
y = Q.front().y;
mod = Q.front().mod;
Q.pop();
for (i = 0; i < NUM_DIR; i++) {
X = x + dir[i][0];
Y = y + dir[i][1];
newMod = (mod + a[X][Y]) % k;
if ((a[X][Y] != OBSTACLE) && (d[X][Y][newMod] > d[x][y][mod] + 1)) {
d[X][Y][newMod] = d[x][y][mod] + 1;
Q.push({X, Y, newMod});
}
}
} while ((!Q.empty()) && (x != endX || y != endY));
f = fopen("kdrum.out", "w");
fprintf(f, "%hd\n", d[endX][endY][0]);
fclose(f);
return 0;
}