Pagini recente » Cod sursa (job #183185) | Cod sursa (job #719320) | Cod sursa (job #1606505) | Cod sursa (job #2296243) | Cod sursa (job #2519050)
#include <fstream>
#include <queue>
using namespace std;
ifstream f("kdrum.in");
ofstream g("kdrum.out");
int n,m,i,j,k;
int a[51][51];
int drum[51][51];
int aux[51][51];
int l1,c1, l2,c2;
queue < pair < int, int > > coada;
int x,y, xx,yy;
int dx[4]={1, -1, 0, 0};
int dy[4]={0, 0, 1, -1};
bool c[12001];
int p[1439], nrp;
void ciur(int x)
{
int i,j;
for (i=2;i<=x;i++)
if (!c[i])
{
nrp++;
p[nrp]=i;
for (j=i*2;j<=x;j+=i)
c[j]=1;
}
}
bool inauntru(int x, int y)
{
return (x>=1 && x<=n && y>=1 && y<=m);
}
void constr(int x, int &aux)
{
for (int i=1;i<=nrp && p[i]<=x && p[i]<=aux;i++)
while (x%p[i]==0 && aux%p[i]==0)
{
x=x/p[i];
aux=aux/p[i];
}
}
int main()
{
f>>n>>m>>k;
f>>l1>>c1>>l2>>c2;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
f>>a[i][j];
aux[i][j]=k;
}
ciur(k);
drum[l1][c1]=1;
coada.push(make_pair(l1, c1));
while (!coada.empty())
{
x=coada.front().first;
y=coada.front().second;
coada.pop();
constr(a[x][y], aux[x][y]);
for (i=0;i<4;i++)
{
xx=x+dx[i];
yy=y+dy[i];
if (inauntru(xx, yy) && (drum[xx][yy]==0 || aux[x][y]<aux[xx][yy]))
{
drum[xx][yy]=drum[x][y]+1;
aux[xx][yy]=aux[x][y];
coada.push(make_pair(xx, yy));
}
}
}
g<<drum[l2][c2];
return 0;
}