Cod sursa(job #3130088)

Utilizator user12345user user user user12345 Data 16 mai 2023 20:11:06
Problema Kdrum Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m, k, a[51][51];
int xs, ys, xf, yf;
map <pair<int, int>, int> M;

inline int cmmdc(long long a, int b = k) {

    while (b) {

        int r = a % b;
        a = b;
        b = r;
    }

    return a;
}

struct nod {

    int i, j;
    int nr, dst;

    bool operator<(const nod &aux) const {

        if (dst == aux.dst)
            return nr < aux.nr;
        return dst > aux.dst;
    }
};

priority_queue<nod> Q;
int d1[] = {-1, 0, 1, 0};
int d2[] = {0, 1, 0, -1};

inline bool in(int i, int j) {

    return i >= 1 && i <= n && j >= 1 && j <= m;
}

int main() {

    fin >> n >> m >> k;
    fin >> xs >> ys >> xf >> yf;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            fin >> a[i][j];

    Q.push({xs, ys, cmmdc(a[xs][ys], k), 1});
    M[{xs, ys}] = cmmdc(a[xs][ys], k);

    while (!Q.empty()) {

        int i = Q.top().i;
        int j = Q.top().j;
        int nr = Q.top().nr;
        int dst = Q.top().dst;
        Q.pop();

        if (i == xf && j == yf) {

            fout << dst;
            return 0;
        }

        for (int l = 0; l < 4; l++) {

            int x = i + d1[l];
            int y = j + d2[l];
            int aux = cmmdc(1LL * nr * a[x][y]);

            if (in(x, y))
                Q.push({x, y, aux, dst + 1}), M[{x, y}] = aux;
        }
    }

    return 0;
}