POJ 2312 Battle City(bfs)
2015-07-10 09:20
465 查看
Description
题目背景就是小时候玩的坦克大战,求从起点到终点最少需要多少步。已知S和R是不能走得,E是空的,可以走,B是砖,只有打掉后才可以通过
Input
多组用例,每组用例第一行为row和col表示迷宫行列数,然后是一个row*col矩阵表示迷宫,以0 0结束输入
Output
对于每组用例,若能到达终点则输出最短步数,否则输出-1
Sample Input
3 4
YBEB
EERE
SSTE
0 0
Sample Output
8
Solution
容易看出这是一道bfs的题目,但是因为走E和走B所需要的时间不一样,因此不能用普通的队列存点。因为对于走B来说,要先打掉砖才能通过,所以我们可以理解为走B需要两步,而走E是指需要1步的。因此,不能用普通队列来存。我们可以用STL中的优先队列来存,每次从队头取出的都是步数少的点就可以了。这样最先搜到的就是最优解
Code
题目背景就是小时候玩的坦克大战,求从起点到终点最少需要多少步。已知S和R是不能走得,E是空的,可以走,B是砖,只有打掉后才可以通过
Input
多组用例,每组用例第一行为row和col表示迷宫行列数,然后是一个row*col矩阵表示迷宫,以0 0结束输入
Output
对于每组用例,若能到达终点则输出最短步数,否则输出-1
Sample Input
3 4
YBEB
EERE
SSTE
0 0
Sample Output
8
Solution
容易看出这是一道bfs的题目,但是因为走E和走B所需要的时间不一样,因此不能用普通的队列存点。因为对于走B来说,要先打掉砖才能通过,所以我们可以理解为走B需要两步,而走E是指需要1步的。因此,不能用普通队列来存。我们可以用STL中的优先队列来存,每次从队头取出的都是步数少的点就可以了。这样最先搜到的就是最优解
Code
#include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; #define maxn 305 struct node { int x,y,step; bool operator<(const node &p)const{ //优先队列的排序函数 return step>p.step;} }; char map[maxn][maxn]; int flag[maxn][maxn];//标记数组 int row,col; int sx,sy,ex,ey; int dx[]={-1,0,1,0},dy[]={0,-1,0,1};//上下左右四个方向 int bfs() { priority_queue<node>que;//优先队列 node p; p.x=sx;p.y=sy;p.step=0;//起点步数为0 flag[sx][sy]=1;//标记起点 que.push(p);//起点入队 while(!que.empty()) { node t=que.top();//出队 que.pop(); if(t.x==ex&&t.y==ey)//到达终点 return t.step; for(int i=0;i<4;i++)//四个方向枚举 { int xx=t.x+dx[i],yy=t.y+dy[i]; if(xx>=0&&xx<row&&yy>=0&&yy<col&&!flag[xx][yy]) { if(map[xx][yy]=='S'||map[xx][yy]=='R')//不能走 continue; node temp; temp.x=xx;temp.y=yy;//能走 flag[xx][yy]=1;//标记 if(map[xx][yy]=='B')//是砖则需走两步 temp.step=t.step+2; else//是空地则需走一步 temp.step=t.step+1; que.push(temp);//入队 } } } return -1;//不能到达终点,返回-1 } int main() { while(cin>>row>>col&&row) { memset(map,'0',sizeof(map));//初始化 memset(flag,0,sizeof(flag));//初始化 for(int i=0;i<row;i++) for(int j=0;j<col;j++) { cin>>map[i][j]; if(map[i][j]=='Y')//起点坐标 {sx=i;sy=j;} if(map[i][j]=='T')//终点坐标 {ex=i;ey=j;} } int ans=bfs(); printf("%d\n",ans); } return 0; }
相关文章推荐
- Andropid自定义组件-坐标详解
- 面向过程和面向对象的区别
- 使用NSDate与总结
- [转载] 高并发系统中的常见问题
- C++ 之cin与cout常见问题详解
- 百度地图开发------基础地图篇------缩放空间和比例尺控件移动位置无效问题
- win10预览版右下角小广告怎么关闭?
- Mac 下安装Ruby环境
- sift算法c语言实现
- Unix或Linux中&、jobs、fg、bg等命令的使用方法
- Angular vs. React - the tie breaker
- Matlab Newton‘s method
- Mac 下安装Ruby环境
- 跑吧盒子君
- CocoaPods安装和使用教程
- C#与Java的比较
- document.all.WebBrowser.ExecWB的完整说明
- <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0"/>解释
- coentos6.5 64bit 安装perl5
- webpack: require.ensure与require AMD的区别