Pagini recente » Cod sursa (job #2718327) | Cod sursa (job #960219) | Cod sursa (job #1547245) | Rating Catalin Bugnar (Catalin1231) | Cod sursa (job #1555348)
#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
#define INF 999999999
int n,m,k,mat[60][60];
int dx[]= {-1,1,0,0};
int dy[]= {0,0,-1,1};
int dist[53][53][12009],divi[12009],poz[12008];
int cmmdc(int a, int b)
{
int r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
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 a,int b,int c)
{
dist[a][b][c]=1;
Q.push(m_s(a,b,c));
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)||mat[xn][yn]==0)continue;
int nr_divn=poz[cmmdc(mat[xn][yn]*divi[nr_div],k)];
if(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,el;
in>>n>>m>>k;
in>>xs>>ys>>xf>>yf;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
in>>mat[i][j];
el=0;
for (int i=1; i<=k; i++)
if(k%i==0)
{
divi[++el]=i;
poz[i]=el;
}
int pas=poz[cmmdc(mat[xs][ys],k)];
bfs(xs,ys,pas);
out<<dist[xf][yf][el];
return 0;
}