Pagini recente » Cod sursa (job #807898) | Cod sursa (job #1043440) | Cod sursa (job #2496516) | Cod sursa (job #1275204) | Cod sursa (job #1555321)
#include <bits/stdc++.h>
using namespace std;
ifstream in("kdrum.in");
ofstream out("kdrum.out");
#define m_s(a,b,c) make_pair(make_pair(a, b),c)
#define unu first.first
#define doi first.second
#define trei second
int n,m,k,mat[60][60];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int dist[52][52][6009],el,divi[6009],poz[12008];
int cmmdc(int a, int b)
{
int r;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
bool inside(int a,int b)
{
return a>=1 and b>=1 and a<=n and b<=m;
}
queue <pair<pair<int, int>, int > > Q;
void bfs(int x,int y,int nr_div)
{
dist[x][y][nr_div]=1;
Q.push(m_s(x,y,nr_div));
while(!Q.empty())
{
int x=Q.front().unu;
int y=Q.front().doi;
int nr_div=Q.front().trei;
Q.pop();
for(int i=0;i<4;i++)
{
int xn=x+dx[i];
int yn=y+dy[i];
if(!inside(xn,yn))continue;
int nr_divn=poz[cmmdc(mat[xn][yn]*divi[nr_div],k)];
if(inside(xn,yn)&&(dist[xn][yn][nr_divn]>dist[x][y][nr_div]+1||dist[xn][yn][nr_divn]==0))
{
Q.push(m_s(xn,yn,nr_divn));
dist[xn][yn][nr_divn]=dist[x][y][nr_div]+1;
}
}
}
}
int main()
{ int xs,ys,xf,yf;
in>>n>>m>>k;
in>>xs>>ys>>xf>>yf;
el=0;
for (int i=1;i<=k/2;i++)
{
if(k%i==0){divi[++el]=i; poz[i]=el;}
}
divi[++el]=k;
poz[k]=el;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
in>>mat[i][j];
int pas=poz[cmmdc(mat[xs][ys],k)];
bfs(xs,ys,pas);
out<<dist[xf][yf][el];
return 0;
}