#include <iostream>
#include <queue>
using namespace std;
const int MAX = 99999999;
int n,m;
struct st
{
char cc;
int num,x,y,prex,prey;
}map[105][105];
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
void outPut()
{
int x=0,y=0,a,b,num=1,i;
if(map[0][0].num!= MAX)
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n",map[0][0].num);
while(x!= n-1| y!=m-1)
{
a=map[x][y].prex;
b=map[x][y].prey;
if(map[x][y].cc!='.')
for(i=0;i<map[x][y].cc - '0';i++)
printf("%ds:FIGHT AT (%d,%d)\n",num++,x,y);
printf("%ds:(%d,%d)->(%d,%d)\n",num++,x,y,a,b);
x=a; y=b;
}
if(map[x][y].cc!='.')
{
for(i=0;i<map[x][y].cc - '0';i++)
printf("%ds:FIGHT AT (%d,%d)\n",num++,x,y);
}
printf("FINISH\n");
}
else
{
printf("God please help our poor hero.\nFINISH\n");
}
}
void bfs()
{
int temp;
struct st fir;
queue<st> qu;
map[n-1][m-1].num=0;
if(map[n-1][m-1].cc>='1'&&map[n-1][m-1].cc<='9')
map[n-1][m-1].num=map[n-1][m-1].cc - '0';
qu.push(map[n-1][m-1]);
while(!qu.empty())
{
fir=qu.front();
for(int i=0;i<4;i++)
{
int tx=fir.x+dir[i][0],ty=fir.y+dir[i][1];
if(tx<0||ty<0||tx>=n||ty>=m||map[tx][ty].cc=='X') continue;
if(map[tx][ty].cc!='.')
temp=fir.num + map[tx][ty].cc-'0';
else
temp=fir.num;
if(temp+1<map[tx][ty].num)
{
map[tx][ty].num=temp+1;
map[tx][ty].prex=fir.x;
map[tx][ty].prey=fir.y;
qu.push(map[tx][ty]);
}
}
qu.pop();
}
outPut();
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
getchar();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%c",&map[i][j].cc);
map[i][j].num = MAX;
map[i][j].x=i;
map[i][j].y=j;
map[i][j].prey=map[i][j].prex=-1;
}
getchar();
}
bfs();
}
}
hdu 1026(BFS)
最新推荐文章于 2018-06-06 10:04:42 发布