题目大意:
迷宫问题,已知出发点和终点,求两点之间时间最短的路径,要注意,迷宫中有怪物,走到有怪物的格子要击败怪物,用时等于怪物的血量。
题目解析:
迷宫问题,马上想到用dfs或bfs,像这种求一条最短路线的就用bfs,由于涉及到不同血量的怪物,我们采用优先队列可以解决这个问题。题目要求输出走过的节点,我们可以定义结构体node,每次记下前驱结点,到终点用一个dfs函数输出沿线坐标;也可以从终点出发,用next记下要输出的后一个坐标。
具体代码:
#include<iostream>
#include<algorithm>
#include<climits>
#include<queue>
using namespace std;
int d[4][2] {-1,0,1,0,0,-1,0,1};
bool vis[110][110];
char map[110][110];//迷宫不超过110行
struct node { //此时所在的位置
friend bool operator <(node a,node b) {
return a.time>b.time;
}
int x;
int y;
int Nextx;
int Nexty;
int time;
}A[110][110];
int main() {
int n,m;
while(cin>>n>>m) {
for(int i=0; i<n; i++)
for(int j=0; j<m; j++) {
cin>>map[i][j];
vis[i][j]=false;
}
//初始化优先队列
priority_queue<node> Q;
A[n-1][m-1].x=m-1;
A[n-1][m-1].y=n-1;
A[n-1][m-1].Nextx=-1;
A[n-1][m-1].Nexty=-1;
if(map[n-1][m-1]=='.')
A[n-1][m-1].time=0;
else
A[n-1][m-1].time=map[n-1][m-1]-'0';
Q.push(A[n-1][m-1]);
node now;
while(!Q.empty()) {
now=Q.top();
// cout<<now.x<<","<<now.y<<" ";
Q.pop();
vis[now.y][now.x]=true;
if(now.x==0&&now.y==0) { //如果到了目的地
break;
}
//否则可以向四个方向移动
for(int i=0; i<4; i++) {
int dx=now.x+d[i][0];
int dy=now.y+d[i][1];
if(dx<0||dx>=m||dy<0||dy>=n||map[dy][dx]=='X'||vis[dy][dx]==true) continue;//非法位置
else if(map[dy][dx]=='.') { //没有怪的路
vis[dy][dx]=true;
A[dy][dx].x=dx;
A[dy][dx].y=dy;
A[dy][dx].Nextx=now.x;
A[dy][dx].Nexty=now.y;
A[dy][dx].time=now.time+1;
Q.push(A[dy][dx]);
} else { //有怪物的路
vis[dy][dx]=true;
int hp=map[dy][dx]-'0';
A[dy][dx].x=dx;
A[dy][dx].y=dy;
A[dy][dx].Nextx=now.x;
A[dy][dx].Nexty=now.y;
A[dy][dx].time=now.time+1+hp;
Q.push(A[dy][dx]);
}
}
}
if(now.x==0&&now.y==0) {
printf("It takes %d seconds to reach the target position, let me show you the way.\n",now.time);
int count=1;
int x=0,y=0;
while(x!=m-1||y!=n-1) {
int Nextx=A[y][x].Nextx,Nexty=A[y][x].Nexty;
if(map[Nexty][Nextx]=='.') {
printf("%ds:(%d,%d)->(%d,%d)\n",count++,y,x,Nexty,Nextx);
} else {
printf("%ds:(%d,%d)->(%d,%d)\n",count++,y,x,Nexty,Nextx);
int time=map[Nexty][Nextx]-'0';//下一个怪
for(int i=0; i<time; i++)
printf("%ds:FIGHT AT (%d,%d)\n",count++,Nexty,Nextx);
}
y=Nexty;
x=Nextx;
}
}
else {
printf("God please help our poor hero.\n");
}
printf("FINISH\n");
}
return 0;
}