Pagini recente » Cod sursa (job #171376) | Cod sursa (job #311521) | Cod sursa (job #1301922) | Cod sursa (job #2295637) | Cod sursa (job #1938677)
#include<fstream>
#include<vector>
#include<string>
#include<queue>
#define maxN 52
#define maxM 52
#define maxK 12002
#define maxD 1002
#define inf 1000000000
using namespace std;
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
struct Cell
{
int x, y, d;
};
queue <Cell> q;
string sir;
int i, n, k, j,m,sol,x,y;
int a[maxN][maxN], dp[maxN][maxN][maxD], divizori[maxD], index[maxK];
int nrDivizori;
int x1, x2, y1, y2;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
int gcd(int x, int y)
{
int r = x % y;
while (r)
{
x = y;
y = r;
r = x % y;
}
return y;
}
void init()
{
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= m; ++ j)
for (int d = 1; d <= nrDivizori; ++ d)
dp[i][j][d] = inf;
}
bool ok(int x, int y)
{
return (x > 0 && y > 0 && x <= n && y <= m && a[x][y]);
}
int main()
{
fin >> n >> m >> k;
nrDivizori = 0;
for(i = 1; i <= k; i++)
{
if(k % i == 0)
{
divizori[++nrDivizori] = i;
index[i] = nrDivizori;;
}
}
for(i = 1; i <= nrDivizori; i++)
{
//fout << index[divizori[i]] << " ";
}
init();
fin >> x1 >> y1 >> x2 >> y2;
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
fin >> a[i][j];
}
}
int d = gcd(k, a[x1][y1]);
//fout << d <<"\n";
d = index[d];
//fout << d << "\n";
dp[x1][y1][d] = 1;
q.push({x1, y1, d});
while(! q.empty())
{
Cell nod = q.front();
int x, y;
x = nod.x;
y = nod.y;
q.pop();
for(int i=0;i<=3;i++)
{
if(ok(x+dx[i], y+dy[i]))
{
d = gcd(k, a[x+dx[i]][y+dy[i]] * divizori[nod.d]);
d = index[d];
if(dp[x+dx[i]][y+dy[i]][d] == inf)
{
dp[x+dx[i]][y+dy[i]][d] = dp[x][y][nod.d] + 1;
q.push({x+dx[i], y+dy[i], d});
}
//fout << x+dx[i] << " " << y+dy[i] << " " << d<<"\n";
//fout << x+dx[i] << " " << y+dy[i] << " " << a[x+dx[i]][y+dy[i]]<<"\n";
//fout << x+dx[i] << " " << y+dy[i]
}
}
}
fout << dp[x2][y2][nrDivizori] << "\n";
// fout <<"------\n";
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
//fout << a[i][j] << " ";
}
//fout << "\n";
}
}