Cod sursa(job #2700905)

Utilizator Iulia25Hosu Iulia Iulia25 Data 29 ianuarie 2021 11:54:57
Problema Kdrum Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <map>
#include <queue>

using namespace std;

ifstream cin ("kdrum.in");
ofstream cout ("kdrum.out");

int n, m, k, x1, y1, x2, y2;
int a[55][55];

struct idk  {
  int x, y, val;
};

map <short int, int> dp[55][55];
queue <idk> q;

int dl[] = {-1, 0, 0, 1};
int dc[] = {0, -1, 1, 0};

int cmmdc(int x, int y)  {
  if (!x || !y)
    return 0;
  int r = x % y;
  while (r)  {
    x = y;
    y = r;
    r = x % y;
  }
  return y;
}

int main()  {
  cin >> n >> m >> k >> x1 >> y1 >> x2 >> y2;
  for (int i = 1; i <= n; ++i)  {
    for (int j = 1; j <= m; ++j)  {
      cin >> a[i][j];
      a[i][j] = cmmdc(a[i][j], k);
    }
  }
  dp[x1][y1][a[x1][y1]] = 1;
  q.push({x1, y1, a[x1][y1]});
  while (!q.empty())  {
    int x = q.front().x;
    int y = q.front().y;
    int val = q.front().val;
    q.pop();
    for (int i = 0; i < 4; ++i)  {
      if (x + dl[i] > 0 && x + dl[i] <= n && y + dc[i] <= m && y + dc[i] > 0)  {
        int aux = cmmdc(val * a[x + dl[i]][y + dc[i]], k);
        if (!dp[x + dl[i]][y + dc[i]][aux])  {
          dp[x + dl[i]][y + dc[i]][aux] = dp[x][y][val] + 1;
          q.push({x + dl[i], y + dc[i], aux});
          if (x + dl[i] == x2 && y + dc[i] == y2 && aux == k)  {
            cout << dp[x2][y2][k];
            return 0;
          }
        }
      }
    }
  }
  cout << dp[x2][y2][k];
  return 0;
}