Pagini recente » Cod sursa (job #495087) | Cod sursa (job #2032064) | Cod sursa (job #1569013) | Cod sursa (job #2073302) | Cod sursa (job #2013397)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
const int Dim = 52, MaxK = 12001, Inf = 0x3f3f3f3f;
const int dx[] = { 0, 1, 0, -1};
const int dy[] = { 1, 0, -1, 0};
struct Tri {
Tri(int _x, int _y, int _z) : x(_x), y(_y), z(_z)
{}
int x, y, z;
};
queue<Tri> Q;
int n, m, k;
int x1, x2, y1, y2;
int a[Dim][Dim];
int b[Dim][Dim][205];
int p[MaxK], d[MaxK];
void Read();
int Cmmdc(int a, int b);
void Bfs();
bool Ok(int x, int y);
void Fact();
int main()
{
Read();
Fact();
Bfs();
fout << b[x2][y2][p[k]];
return 0;
}
void Read()
{
fin >> n >> m >> k;
fin >> x1 >> y1 >> x2 >> y2;
for ( int i = 1; i <= n; i++ )
for ( int j = 1; j <= m; j++ )
fin >> a[i][j];
}
int Cmmdc(int a, int b)
{
int c;
while (b)
{
c = b;
b = a % b;
a = c;
}
return a;
}
bool Ok(int x, int y)
{
if ( x > n || y > m || x < 1 || y < 1 || a[x][y] == 0 )
return false;
return true;
}
void Bfs()
{
int x, y, xi, yi, val, vali;
Tri t = Tri(x1, y1, p[Cmmdc(a[x1][y1], k)]);
b[x1][y1][Cmmdc(a[x1][y1], k)] = 1;
Q.push(t);
while ( !Q.empty() )
{
t = Q.front();
Q.pop();
x = t.x;
y = t.y;
val = t.z;
for ( int i = 0; i < 4; i++ )
{
xi = x + dx[i];
yi = y + dy[i];
if ( Ok(xi, yi) )
{
vali = Cmmdc(k, d[val] * a[xi][yi]);
if ( !b[xi][yi][p[vali]])
{
b[xi][yi][p[vali]] = b[x][y][val] + 1;
Q.push(Tri(xi, yi, p[vali]));
}
}
}
}
}
void Fact()
{
int nr = 0;;
for (int i = 1; i <= k; ++i)
if ( k % i == 0 )
{
d[++nr] = i;
p[i] = nr;
}
return;
}