Pagini recente » Cod sursa (job #1172431) | Cod sursa (job #1409769) | Cod sursa (job #2787776) | Cod sursa (job #2893476) | Cod sursa (job #471570)
Cod sursa(job #471570)
#include<stdio.h>
const int N=52;
const int M=72;
const int B=12002;
const int X[]={0,1,0,-1};
const int Y[]={1,0,-1,0};
struct xyz{
int x,y,div;
};
int n,m,k,nd;
int id[B],cd[M];//transformarea din divizor in cod
int v[N][N][M];//matricea de costuri
int c[N][N];//matricea citita
xyz q[N*N*M];//coada
int d,u;
xyz st,fn;
int GetDiv(int k){
int nrdiv=0;
for( int i=1; i<=k; ++i)
if(k%i==0){
nrdiv++;
id[i]=nrdiv;
cd[nrdiv]=i;
}
return nrdiv;
}
void Read(){
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d%d%d",&st.x,&st.y,&fn.x,&fn.y);
nd=GetDiv(k);
for( int i=1; i<=n; ++i)
for( int j=1; j<=n; ++j)
scanf("%d",&c[i][j]);
int xsx=k/c[st.x][st.y];
st.div=id[xsx];
}
int cmmdc(int a,int b){
int r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
void Verify(xyz x){
int ax,ay,nw;
xyz aux;
for( int i=0; i<4; ++i){
ax=X[i]+x.x;
ay=Y[i]+x.y;
if(c[ax][ay]){
nw=cmmdc(cd[x.div],c[ax][ay]);
nw=cd[x.div]/nw;
if(!v[ax][ay][id[nw]]){
v[ax][ay][id[nw]]=v[x.x][x.y][x.div]+1;
aux.x=ax;
aux.y=ay;
aux.div=id[nw];
q[++u]=aux;
}
}
}
}
void Parc(){
d=u=1;
q[1]=st;
while(d<=u && v[fn.x][fn.y][1]==0 ){
Verify(q[d]);
++d;
}
printf("%d\n",v[fn.x][fn.y][1]+1);
}
int main()
{
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
Read();
Parc();
return 0;
}