标签:
思路是广度优先搜索+优先队列+路径打印
优先队列详见: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,后来是最后路径打印输出的地方犯了点错误。
标签:
原文地址:http://www.cnblogs.com/luosuo10/p/5202815.html