Pagini recente » Cod sursa (job #2444255) | Cod sursa (job #357835) | Cod sursa (job #1525051) | Cod sursa (job #1508331) | Cod sursa (job #464890)
Cod sursa(job #464890)
/*
* File: kdrum.cpp
* Author: marius
*
* Created on June 21, 2010, 5:04 PM
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
using namespace std;
struct str{
int x,y,st;char *vv;
};
queue<str> q;
int b[35];int l;
char v[55][55][35];
char k[35];
int n,m,kk;
int MIN=-1;
int xx1,xx2,yy1,yy2;
void f(int x){
if(kk%x==0){
b[l]=x;
while(kk%x==0){
kk/=x;
k[l]++;
}
l++;
}
}
void sol(int x,int y, int st,char * vv){
if(x>n||y>m||x==0||y==0||v[x][y][0]==-1)
return;
if(MIN!=-1&&st>=MIN)
return;
char * vvv=new char[l];
memcpy(vvv,vv,l*sizeof(char));
if(x==xx2&&y==yy2){
for(int i=0;i<l;i++)
if(vvv[i]){
delete[] vvv;
return;
}
MIN=st;
delete[] vvv;
return;
}
for(int i=0;i<l;i++)
vvv[i]-=v[x][y][i];
st++;
str s;
s.x=x-1;s.y=y;s.st=st;s.vv=vvv;
q.push(s);
s.x=x+1;
q.push(s);
s.x=x;s.y=y-1;
q.push(s);
s.y=y+1;
q.push(s);
delete[] vvv;
}
int main(int argc, char** argv) {
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
int x;
scanf("%d%d%d",&n,&m,&kk);
scanf("%d%d%d%d",&xx1,&yy1,&xx2,&yy2);
f(2);
int d=3;
while(sqrt(kk)>=d){
f(d);
d+=2;
}
if(kk!=1)
f(kk);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&x);
if(x==0){
v[i][j][0]=-1;
continue;
}
for(int ii=0;ii<l;ii++){
while(x%b[ii]==0){
x/=b[ii];
v[i][j][ii]++;
}
if(x==1)
continue;
}
}
sol(xx1,yy1,1,k);
while(!q.empty()){
str s=q.front();q.pop();
sol(s.x,s.y,s.st,s.vv);
}
printf("%d",MIN);
return (EXIT_SUCCESS);
}