Pagini recente » Cod sursa (job #2248378) | Cod sursa (job #2759590) | Cod sursa (job #447374) | Cod sursa (job #234622) | Cod sursa (job #2542977)
#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;
}