思路是广度优先搜索+优先队列+路径打印
优先队列详见:http://www.cnblogs.com/luosuo10/p/5194788.html
#include <iostream> #include<ctype.h> #include <queue> using namespace std; int sx,sy,gx,gy,n,m; const int inf=99999; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; int road_t; #define judge(x,y) 0<=x&&x<n&&0<=y&&y<m struct P { int x,y,t; char data; int prex,prey; bool operator <(const P&a)const //这么多const { return a.t<t; } }map[105][105]; int bfs() { priority_queue<P>que; P p; map[sx][sy].t=0; que.push(map[sx][sy]); while(que.size()) { p=que.top(); que.pop(); if(p.x==gx&&p.y==gy) {break;} for(int i=0;i<4;i++) { int nx=p.x+dx[i]; int ny=p.y+dy[i]; if(judge(nx,ny)) { if(map[nx][ny].data==‘.‘&&map[nx][ny].t>p.t+1) { map[nx][ny].t=p.t+1; map[nx][ny].prex=p.x;map[nx][ny].prey=p.y; que.push(map[nx][ny]); } else if(isdigit(map[nx][ny].data)&& map[nx][ny].t>p.t+map[nx][ny].data-‘0‘)//isdigit*** //else if(map[nx][ny].data!=‘X‘&&map[nx][ny].t>p.t+map[nx][ny].data-‘0‘)//***** { map[nx][ny].t=p.t+map[nx][ny].data-‘0‘+1;//到达 1s 然后打怪兽n秒 map[nx][ny].prex=p.x;map[nx][ny].prey=p.y; que.push(map[nx][ny]); } } } } return map[gx][gy].t; } void print(P p) { if(p.prex!=sx||p.prey!=sy) { print(map[p.prex][p.prey]); } ++road_t; cout<<road_t<<"s:("<<p.prex<<","<<p.prey<<")->("<<p.x<<","<<p.y<<")"<<endl; while(road_t!=p.t) { road_t++; cout<<road_t<<"s:FIGHT AT ("<<p.x<<","<<p.y<<")"<<endl; } } int main() { while(cin>>n>>m) { sx=0;sy=0; gx=n-1;gy=m-1; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>map[i][j].data; map[i][j].t=inf; map[i][j].x=i;//*************一开始这里没输入这两个数据 觉得没用 但是 在判断是否到达终点时用到了 所以没有 map[i][j].y=j; } //output if(bfs()==inf) { cout<<"God please help our poor hero."<<endl; } else { cout<<"It takes "<<bfs()<<" seconds to reach the target position, let me show you the way."<<endl; road_t=0; print(map[gx][gy]); //print(); } cout<<"FINISH"<<endl; } return 0; }
①优先队列里面,结构体的运算符重载:
bool operator <(const P&a)const //这么多const { return a.t<t; }
②关于这个时间记录的方法:
因为一开始都是inf,只要有路径有过那个点,时间必然小于inf能记录下来,然后搜索过程中不断记录更小的时间,就是最短路径了。
#include<ctype.h>
if(isdigit(map[nx][ny].data)&& map[nx][ny].t>p.t+map[nx][ny].data-‘0‘)
③利用这个prex和prey来记录路径,最后是一个路径打印。
犯错的地方是一开始没有x和y,后来是最后路径打印输出的地方犯了点错误。
时间: 2024-10-22 17:47:16