Cod sursa(job #1512884)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 28 octombrie 2015 19:21:24
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#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;
}