Cod sursa(job #2542979)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 10 februarie 2020 19:14:06
Problema Kdrum Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, k, startx, starty, stopx, stopy, matrix[55][55], nr, a[12005], b[12005], dp[55][55][105];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
struct triplet
{
    int x, y, c;
};
queue <triplet> coada;

int main()
{
    fin >> n >> m >> k >> startx >> starty >> stopx >> stopy;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            fin >> matrix[i][j];
    for (int i = 1; i <= k; ++i)
        if (k % i == 0)
        {
            ++nr;
            a[nr] = i;
            b[i] = nr;
        }
    int cmmdc = __gcd(k, matrix[startx][starty]);
    coada.push({startx, starty, b[cmmdc]});
    dp[startx][starty][b[cmmdc]] = 1;
    while (!coada.empty())
    {
        triplet t = coada.front();
        if (t.x == stopx && t.y == stopy && t.c == nr)
        {
            fout << dp[t.x][t.y][t.c];
            return 0;
        }
        coada.pop();
        for (int w = 0; w < 4; ++w)
        {
            int xx = t.x + dx[w];
            int yy = t.y + dy[w];
            if (matrix[xx][yy] == 0)
                continue;
            cmmdc = a[t.c];
            int new_cmmdc = __gcd(cmmdc * matrix[xx][yy], k);
            if (dp[xx][yy][b[new_cmmdc]] != 0)
                continue;
            dp[xx][yy][b[new_cmmdc]] = 1 + dp[t.x][t.y][t.c];
            coada.push({xx, yy, b[new_cmmdc]});
        }
    }
    fin.close();
    fout.close();
    return 0;
}