Cod sursa(job #2631814)

Utilizator PetyAlexandru Peticaru Pety Data 1 iulie 2020 12:32:34
Problema Kdrum Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>
#define y1 __y1

using namespace std;

ifstream fin ("kdrum.in");
ofstream fout ("kdrum.out");

struct nod {
  int x, y, d;
};
int dl[4] = {0, 0, -1, 1};
int dc[4] = {1, -1, 0, 0};

int n, m, k, dp[52][52][52], nrd[50], f[12002], v[52][52], nr, x1, y1, x2, y2;

int main()
{
  fin >> n >> m >> k;
  fin >> x1 >> y1 >> x2 >> y2;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      fin >> v[i][j];
  for (int i = 1; i <= k; i++) {
    if (k % i == 0) {
      nrd[++nr] = i;
      f[i] = nr;
    }
  }
  queue<nod>q;
  q.push({x1, y1, f[__gcd(v[x1][y1], k)]});
  dp[x1][y1][f[__gcd(v[x1][y1], k)]] = 1;
  while (!q.empty()) {
    int x = q.front().x;
    int y = q.front().y;
    int d = q.front().d;
    q.pop();
    for (int i = 0; i < 4; i++) {
      int xx = x + dl[i];
      int yy = y + dc[i];
      int poz = f[nrd[d] * __gcd(k / d, v[xx][yy])];
      if (v[xx][yy] != 0) {
        if (dp[xx][yy][poz] == 0) {
          dp[xx][yy][poz] = dp[x][y][d] + 1;
          q.push({xx, yy, poz});
        }
      }
    }
  }
  fout << dp[x2][y2][nr];
  return 0;
}