Pagini recente » Cod sursa (job #2188500) | Cod sursa (job #751621) | Cod sursa (job #303594) | Cod sursa (job #185060) | Cod sursa (job #1943651)
#include <iostream>
#include <fstream>
#include <queue>
#define INF 30001
using namespace std;
ifstream f("kdrum.in");
ofstream g("kdrum.out");
int n,m,MOD,NR,xi,yi,xf,yf;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int A[55][55];
short seen[100001];
short divisors[150];
short T[55][55][150];
short M[55][55][150];
bool viz[55][55][150];
queue <pair <pair<int,int> ,int> > q;
int cmmdc(int a, int b)
{
int r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
void get_divisors()
{
int i;
for(i=1;i<=MOD;i++)
{
if(!(MOD%i))
{
divisors[++NR]=i;
seen[i]=NR;
}
}
}
bool valid(int i, int j)
{
return (i>=1 and i<=n and j>=1 and j<=m and A[i][j]);
}
void BFS()
{
get_divisors();
int i,j,k,iu,ju,ku;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
for(k=1;k<=NR;k++)
{
M[i][j][k]=cmmdc(A[i][j]*divisors[k],MOD);
T[i][j][k]=INF;
}
T[xi][yi][seen[M[xi][yi][1]]]=1;
q.push(make_pair(make_pair(xi,yi),seen[M[xi][yi][1]]));
while(!q.empty())
{
i=q.front().first.first;
j=q.front().first.second;
k=q.front().second;
q.pop();
viz[i][j][k]=false;
for(int con=0;con<=3;con++)
{
iu=i+dx[con];
ju=j+dy[con];
if(valid(iu,ju))
{
ku=cmmdc(M[iu][ju][k],MOD);
if(T[iu][ju][seen[ku]]>T[i][j][k]+1)
{
T[iu][ju][seen[ku]]=T[i][j][k]+1;
if(!viz[iu][ju][seen[ku]])
{
viz[iu][ju][seen[ku]]=true;
q.push(make_pair(make_pair(iu,ju),seen[ku]));
}
}
}
}
}
}
int main()
{
f>>n>>m>>MOD;
f>>xi>>yi>>xf>>yf;
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f>>A[i][j];
BFS();
g<<T[xf][yf][NR];
}