Cod sursa(job #2224848)

Utilizator Robert_VRVRobert Vadastreanu Robert_VRV Data 25 iulie 2018 13:08:36
Problema Castel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <stdio.h>
#include <queue>

int main() {

  freopen("castel.in", "r", stdin);
  freopen("castel.out", "w", stdout);

  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  int key[n * m + 1];
  bool visited[n * m + 1];
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      scanf("%d", &key[(i - 1) * m + j]);
      visited[(i - 1) * m + j] = false;
    }

  std::queue<int> q;
  q.push(k);
  visited[k] = true;
  const int moves[4] = {1, -1, m, -m};
  while (!q.empty()) {
    for (int h = 0; h < 4; h++) {
      int pos = q.front() + moves[h];
      if (1 <= pos && pos <= n * m &&
        !visited[pos] && visited[key[pos]] &&
        !(moves[h] == -1 && pos % n == 0) && !(moves[h] == 1 && q.front() % n == 0)) {
        visited[pos] = true;
        q.push(pos);
      }
    }
    q.pop();
  }

  int ans = 0;
  for (int i = 1; i <= n * m; i++)
    ans += visited[i];
  printf("%d\n", ans);

  fclose(stdin);
  fclose(stdout);

  return 0;
}