Pagini recente » Cod sursa (job #2628362) | Cod sursa (job #2794307) | Cod sursa (job #1172988) | Cod sursa (job #717329) | Cod sursa (job #264752)
Cod sursa(job #264752)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int dx[4]={-1,0,1,0},
dy[4]={0,1,0,-1},
Inf=2000000000;
int N,M,K,a[55][55],x1,y1,x2,y2;
vector<int> Div,d[55][55];
ifstream f("kdrum.in");
ofstream g("kdrum.out");
int cmmdc(int x,int y){
return y!=0?cmmdc(y,x%y):x;
}
struct stare{
int x,y,p;
stare(){}
stare(int x,int y,int p){
this->x=x;
this->y=y;
this->p=p;
}
};
queue<stare> Q;
int I[12021];
int main(){
int i,j,xx,yy,pp;
f>>N>>M>>K;
f>>x1>>y1>>x2>>y2;
for (i=1;i<=N;++i)
for (j=1;j<=M;++j){
f>>a[i][j];
a[i][j]=cmmdc(a[i][j],K);
}
for (i=1;i<=K;++i)
if (K%i==0){
Div.push_back(i);
I[i]=Div.size()-1;
}
for (i=1;i<=N;++i)
for (j=1;j<=M;++j)
d[i][j].resize(Div.size(),Inf);
d[x1][y1][I[a[x1][y1]]]=1;
Q.push(stare(x1,y1,I[a[x1][y1]]));
for (;!Q.empty();Q.pop()){
stare S=Q.front();
for (i=0;i<4;++i){
xx=S.x+dx[i];
yy=S.y+dy[i];
if (xx<1 || xx>N) continue;
if (yy<1 || yy>M) continue;
pp=I[cmmdc(Div[S.p]*a[xx][yy],K)];
if (d[S.x][S.y][S.p]+1<d[xx][yy][pp])
{
d[xx][yy][pp]=d[S.x][S.y][S.p]+1;
Q.push(stare(xx,yy,pp));
}
}
}
g<<d[x2][y2][I[K]];
return 0;
}