Cod sursa(job #1900609)

Utilizator cella.florescuCella Florescu cella.florescu Data 3 martie 2017 15:19:28
Problema Kdrum Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 50;
const int MAXK = 12000;

int st[MAXN + 2][MAXN + 2][100];
int mat[MAXN + 2][MAXN + 2];
int divi[MAXK + 1], divv[100];
int dirl[] = {-1, 0, 1, 0}, dirc[] = {0, 1, 0, -1};

inline int cmmdc(int a, int b) {
  while (b) {
    int r = a % b; a = b; b = r;
  }
  return a;
}

struct Stuff {
  int lin, col, dv;
};

queue <Stuff> q;

int main()
{
    int n, m, k, x1, x2, y1, y2, nd;
    ifstream fin("kdrum.in");
    fin >> n >> m >> k >> x1 >> y1 >> x2 >> y2;
    for (int i = 1; i <= n; ++i)
      for (int j = 1; j <= m; ++j)
        fin >> mat[i][j];
    fin.close();
    nd = 0;
    for (int d = 1; d <= k; ++d)
      if (k % d == 0) {
        divi[d] = ++nd;
        divv[nd] = d;
      }
    st[x1][y1][divi[cmmdc(mat[x1][y1], k)]] = 1;
    q.push({x1, y1, divi[cmmdc(mat[x1][y1], k)]});
    while (q.empty() == 0) {
      for (int i = 0; i < 4; ++i)
        if (mat[q.front().lin + dirl[i]][q.front().col + dirc[i]] &&
            st[q.front().lin + dirl[i]][q.front().col + dirc[i]][divi[cmmdc(divv[q.front().dv] * mat[q.front().lin + dirl[i]][q.front().col + dirc[i]] , k)]] == 0) {
          st[q.front().lin + dirl[i]][q.front().col + dirc[i]][divi[cmmdc(divv[q.front().dv] * mat[q.front().lin + dirl[i]][q.front().col + dirc[i]] , k)]] =
            st[q.front().lin][q.front().col][q.front().dv] + 1;
          q.push({q.front().lin + dirl[i], q.front().col + dirc[i], divi[cmmdc(divv[q.front().dv] * mat[q.front().lin + dirl[i]][q.front().col + dirc[i]] , k)]});
        }
      q.pop();
    }
    ofstream fout("kdrum.out");
    fout << st[x2][y2][nd] << '\n';
    fout.close();
    return 0;
}