Pagini recente » Cod sursa (job #1073409) | Borderou de evaluare (job #1036184) | Cod sursa (job #1873229) | Cod sursa (job #528526) | Cod sursa (job #2110007)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
int a[55][55][500],n,m,k,x,y,x2,y2;
int b[500],poz[12005],M[55][55],ct;
int dl[]={0,0,-1,1};
int dc[]={1,-1,0,0};
queue<int>C;
int cmmdc(int p,int o)
{ int r;
while(o!=0)
{ r=p%o;
p=o;
o=r;
}
return p;
}
int main()
{
fin>>n>>m>>k;
fin>>x>>y>>x2>>y2;
int i,j,l,c,fact,ll,cc,fact2;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
fin>>M[i][j];
for(i=1;i<=k;++i)
if(k%i==0)
{ b[++ct]=i;
poz[i]=ct;
}
a[x][y][poz[cmmdc(M[x][y],k)]]=1;
C.push(x); C.push(y); C.push(poz[cmmdc(M[x][y],k)]);
while(!C.empty())
{ l=C.front(); C.pop(); c=C.front(); C.pop(); fact=C.front(); C.pop();
for(i=0;i<=3;++i)
{ ll=l+dl[i];
cc=c+dc[i];
if(ll>=1 && ll<=n && cc>=1 && cc<=m)
{ fact2=poz[cmmdc(b[fact]*M[ll][cc],k) ];
if( M[ll][cc]!=0 && a[ll][cc][ fact2] ==0 || a[ll][cc][fact2] > a[l][c][fact] +1 )
{
a[ll][cc][ fact2]=a[l][c][fact] +1;
C.push(ll); C.push(cc); C.push( fact2 );
}
}
}
}
fout<<a[x2][y2][poz[k]];
return 0;
}