题目传送门
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
char maze[105][105];
int maze1[105][105],maze2[105][105];
bool vis[105][105];
int dir[][2]={{0,1},{0,-1},{-1,0},{1,0}};
int n,m;
struct node{
int x,y;
int time;
friend bool operator<(const node &a,const node &b)
{
return a.time>b.time;
}
};
bool check(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&maze[x][y]!='X')
return true;
return false;
}
int bfs();
void dfs(int x,int y,int num);
int main()
{
int ans;
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
scanf("%s",maze[i]);
memset(maze1,0,sizeof(maze1));
memset(maze2,0,sizeof(maze2));
memset(vis,false,sizeof(vis));
ans=bfs();
if(ans==-1)
{
puts("God please help our poor hero.");
}
else
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n",ans);
dfs(n-1,m-1,ans);
}
puts("FINISH");
}
return 0;
}
int bfs()
{
node st,en;
priority_queue<node>qq;
st=(node){0,0,0};
vis[0][0]=true;
qq.push(st);
while(!qq.empty())
{
st=qq.top();
qq.pop();
if(st.x==n-1&&st.y==m-1)
{
return st.time;
}
for(int i=0;i<4;i++)
{
en.x=st.x+dir[i][0];
en.y=st.y+dir[i][1];
if(check(en.x,en.y)&&!vis[en.x][en.y])
{
maze1[en.x][en.y]=st.x;
maze2[en.x][en.y]=st.y;
if(maze[en.x][en.y]=='.')
en.time=st.time+1;
else
en.time=st.time+(maze[en.x][en.y]-'0')+1;
vis[en.x][en.y]=true;
qq.push(en);
}
}
}
return -1;
}
void dfs(int x,int y,int num)
{
if(maze1[x][y]+maze2[x][y])
{
if(maze[x][y]=='.')
dfs(maze1[x][y],maze2[x][y],num-1);
else
dfs(maze1[x][y],maze2[x][y],num-1-(maze[x][y]-'0'));
}
if(maze[x][y]=='.')
printf("%ds:(%d,%d)->(%d,%d)\n",num,maze1[x][y],maze2[x][y],x,y);
else
{
printf("%ds:(%d,%d)->(%d,%d)\n",num-maze[x][y]+'0',maze1[x][y],maze2[x][y],x,y);
for(int i=maze[x][y]-'0';i>=1;i--)
printf("%ds:FIGHT AT (%d,%d)\n",num+1-i,x,y);
}
}