Pagini recente » Cod sursa (job #679029) | Cod sursa (job #961320)
Cod sursa(job #961320)
#include <fstream>
#include <queue>
using namespace std;
struct mp{
int x;
int y;
int z;
mp(int _x, int _y, int _z): x(_x), y(_y), z(_z){}
};
int n, m, k, x1, x2, y1, y2, a[55][55], l[55][55][200];
int fact[200];
int poz[12002];
int nrdiv;
queue <mp> Q;
inline int cmmdc(int a,int b)
{
if(b==0)
return a;
return cmmdc(b,a%b);
}
int main()
{
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
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];
for(int i = 1 ; i <= k ; ++ i)
if(k % i == 0)
{
fact[++nrdiv] = i;
poz[i] = nrdiv;
}
const int dx[] = {-1, 0, 1, 0};
const int dy[] = { 0, 1, 0, -1};
l[x1][y1][ poz[cmmdc(k, a[x1][y1] )] ] = 1;
for(Q.push(mp(x1, y1, poz[ cmmdc( k, a[x1][y1] ) ] )); !Q.empty() ; Q.pop() )
{
int x = Q.front().x;
int y = Q.front().y;
int z = Q.front().z;
for(int i = 0 ; i < 4; ++ i)
{
int xnou = x + dx[i];
int ynou = y + dy[i];
if(xnou<1 || xnou >n || ynou<1 || ynou>m || !a[xnou][ynou] ) continue;
int t = poz[ cmmdc(k, fact[z]*a[xnou][ynou]) ];
if(!l[xnou][ynou][t] || l[xnou][ynou][t] > l[x][y][z] +1 )
{
l[xnou][ynou][t]=l[x][y][z]+1;
Q.push(mp(xnou,ynou,t));
}
}
}
fout << l[x2][y2][nrdiv] << "\n";
return 0;
}