Pagini recente » Cod sursa (job #489549) | Cod sursa (job #862376) | Cod sursa (job #1623483) | Cod sursa (job #776674) | Cod sursa (job #433645)
Cod sursa(job #433645)
#include<stdio.h>
#define infile "kdrum.in"
#define outfile "kdrum.out"
#define nmax 51
#define nrmax 10
const int ii[]={-1,0,1,0};
const int jj[]={0,1,0,-1};
struct coada
{
int i,j; //coordonatele
int conf; //configuratia
} co[nmax*nmax*nrmax]; //coada
int dp[nmax][nmax][nrmax]; //dp[i][j][conf]=costul minim pana la (i,j) avand factorii primi din conf
int h[nmax][nmax]; //harta fetitei
int d[nrmax]; //descompunerea in factori primi a lui k
int n,m; //dimensiunea hartii
int k; //numarul cu care trebuie sa fie divizibil produsul de pe traseu
int xx1,yy1; //pozitia de start
int xx2,yy2; //pozitia finala
int nr; //numarul de factori primi din descompunerea lui k
int conf(int x)
{
int conf=0,i;
for(i=1;d[i]<=x && i<=nr;i++)
if(x%d[i]==0)
conf+=(1<<(i-1)), x/=d[i];
return conf;
}
void read()
{
int i,j;
scanf("%d %d %d\n",&n,&m,&k);
scanf("%d %d %d %d\n",&xx1,&yy1,&xx2,&yy2);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&h[i][j]);
}
void init()
{
int i;
//facem descompunerea lui k
//in factori primi
for(i=2;i<=k;i++)
while(k%i==0)
d[++nr]=i, k/=i;
}
void solve()
{
int st,dr;
int i,j,k,t;
int x,y,z;
//initializam coada
st=dr=1, co[1].i=xx1, co[1].j=yy1, co[1].conf=conf(h[xx1][yy1]);
dp[xx1][yy1][co[1].conf]=1;
while(st<=dr)
{
i=co[st].i;
j=co[st].j;
k=co[st].conf;
for(t=0;t<4;t++)
{
x=i+ii[t];
y=j+jj[t];
if(x>0 && x<=n && j>0 && j<=m && h[x][y])
{
z=k|conf(h[x][y]);
if(!dp[x][y][z])
{
dp[x][y][z]=dp[i][j][k]+1;
++dr, co[dr].i=x, co[dr].j=y, co[dr].conf=z;
if(x==xx2 && y==yy2 && z==(1<<nr)-1) return;
}
}
}
st++;
}
}
void write()
{
printf("%d\n",dp[xx2][yy2][(1<<nr)-1]);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
init();
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}