Pagini recente » Cod sursa (job #1475481) | Cod sursa (job #1288543) | Monitorul de evaluare | Cod sursa (job #185399) | Cod sursa (job #2185080)
#include <cstdio>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
FILE *g=fopen("kdrum.out","w");
int n,m,k,map[52][52],map2[52][52],resturi[52][52],dl[4]={-1,0,1,0},dc[4]={0,1,0,-1},xc,yc,xv,yv,xi,yi,xf,yf;
struct triplu{int x,y,rest;};
queue <triplu> Q;
void citire()
{
FILE *f=fopen("kdrum.in","r");
fscanf(f,"%i %i %i",&n,&m,&k);
fscanf(f,"%i %i %i %i",&xi,&yi,&xf,&yf);
for(int i=1;i<n+1;i++)
for(int j=1;j<m+1;j++)
{
fscanf(f,"%i",&map[i][j]);
if(map[i][j]!=0)
map2[i][j]=inf;
resturi[i][j]=map[i][j];
}
}
void bordare()
{
for(int i=0;i<n+2;i++)
{
map[i][0]=-1;
map[i][m+1]=-1;
map2[i][0]=-1;
map2[i][m+1]=-1;
resturi[i][0]=-1;
resturi[i][m+1]=-1;
}
for(int i=0;i<m+2;i++)
{
map[0][i]=-1;
map[n+1][i]=-1;
map2[0][i]=-1;
map2[n+1][i]=-1;
resturi[0][i]=-1;
resturi[n+1][i]=-1;
}
}
void lee()
{
map2[xi][yi]=1;
triplu t;
t.x=xi;
t.y=yi;
t.rest=k;
Q.push(t);
while(!Q.empty())
{
xc=Q.front().x;
yc=Q.front().y;
for(int i=0;i<4;i++)
{
xv=xc+dl[i];
yv=yc+dc[i];
if((map2[xv][yv]>0)&&(map2[xc][yc]+1<map2[xv][yv]))
{
if((Q.front().rest/resturi[xv][yv]>0)&&(Q.front().rest/resturi[xv][yv]<resturi[xv][yv]))
{
map2[xv][yv]=map2[xc][yc]+1;
t.x=xv;
t.y=yv;
t.rest=Q.front().rest/resturi[xv][yv];
resturi[xv][yv]=Q.front().rest/resturi[xv][yv];
Q.push(t);
}
else
{
map2[xv][yv]=map2[xc][yc]+1;
t.x=xv;
t.y=yv;
t.rest=Q.front().rest;
Q.push(t);
}
}
}
Q.pop();
}
}
int main()
{
citire();
bordare();
lee();
/*for(int i=0;i<n+2;i++)
{
for(int j=0;j<m+2;j++)
printf("%2i ",map[i][j]);
printf("\n");
}
for(int i=0;i<n+2;i++)
{
for(int j=0;j<m+2;j++)
printf("%2i ",map2[i][j]);
printf("\n");
}
for(int i=0;i<n+2;i++)
{
for(int j=0;j<m+2;j++)
printf("%2i ",resturi[i][j]);
printf("\n");
}*/
fprintf(g,"%i",map2[xf][yf]);
return 0;
}