hdu 4198 杭电系列赛(四) BFS + 优先队列
来源:互联网 发布:java调用esb 服务方式 编辑:程序博客网 时间:2024/05/16 03:16
题意:给出一个矩阵h*w,起始点是"S","#"不能走,且矩阵四周用#围起来,边界不是"#"的地方代表出口,遇到“.”的话时间加一,遇到“@”的话时间加(d+1),求从起点离开这个矩阵的最小时间。
思路:普通的BFS不可破,应该用优先队列的BFS,由于出口不唯一吧,所以要写好BFS的出口条件!
//bool operator < (const point &a) const {
if (tim > a.tim) return 1; //时间大的话 则是"小",那么后出队列
return 0;
//return a.tim > b.tim;
}
这样重载小于号 貌似比友元的那种要快
#include<iostream>#include<cstdio>#include<queue>using namespace std;struct point { int x , y; int tim; friend bool operator < (point a , point b) { if (a.tim > b.tim) return 1; //时间大的话 则是"小",那么后出队列 return 0; //return a.tim > b.tim; } };int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};char map[1010][1010];int vis[1010][1010];int h , w , d;int sx , sy , ex , ey;priority_queue<point> Q;int bfs() { point node , start; start.x = sx; start.y = sy; start.tim = 1; vis[sx][sy] = 1; while(!Q.empty()) Q.pop(); Q.push(start); while(!Q.empty()) { start = Q.top(); //printf("%d %d\n",start.x,start.y); Q.pop(); for(int k = 0 ; k < 4 ; k ++) { int xx , yy; xx = start.x + dir[k][0]; yy = start.y + dir[k][1]; if (xx<0||xx>=h||yy<0||yy>=w) return start.tim;//因为出口不止一个吧,所以这样搞 if(!vis[xx][yy]&&map[xx][yy]!='#'&&xx>=0&&xx<h&&yy>=0&&yy<w) { vis[xx][yy] = 1; if (map[xx][yy] == '.') node.tim = start.tim + 1; if (map[xx][yy] == '@') node.tim = start.tim + d + 1; node.x = xx; node.y = yy; //if(xx==0||xx==(h-1)||yy==0||yy==(w-1)) return node.tim; 单出口可以这样 Q.push(node); } } } return -1; }int main() { int N , i , j; scanf("%d",&N); while (N--) { scanf("%d%d%d",&h,&w,&d); memset(vis,0,sizeof(vis)); for (i = 0 ; i < h ; i ++) for(j = 0 ; j < w ; j ++) { cin>>map[i][j]; if(map[i][j]=='S'){ sx = i; sy = j; } } int ans = bfs(); printf("%d\n",ans); } return 0; }
- hdu 4198 杭电系列赛(四) BFS + 优先队列
- 【搜索之BFS + 优先队列】杭电 hdu 1242 Rescue
- 杭电1242-Rescue(bfs+优先队列||队列)
- 杭电1242--Rescue(BFS+优先队列)
- 【杭电oj】1242-Rescue(bfs,优先队列)
- 杭电 hdu 1026 Ignatius and the Princess I(BFS+优先队列+墨迹人的输出)
- 【搜索之BFS + 优先队列】杭电 hdu 1026 Ignatius and the Princess I
- 【搜索之BFS + 优先队列】杭电 hdu 1180 诡异的楼梯
- HDU 1026 (BFS + 优先队列)
- hdu 1242Rescue(bfs+优先队列)
- hdu 1026(优先队列+BFS)
- hdu 1242 Rescue (优先队列+bfs)
- hdu 1026 (优先队列+bfs)
- HDU 1242 Rescue(BFS +优先队列)
- hdu 2822 Dogs(bfs+优先队列)
- HDU 1026 (BFS+优先队列)
- HDU 1242 (BFS+优先队列)
- HDU 1242 Rescue(BFS,优先队列)
- 一个优秀的java技术人员在未来2年发展应掌握的本领
- ASP.NET MVC 学习 --- 第二课 (ddtk-ScVMM)
- 如何在Linux系统中安装MySQL
- C语言之头文件预定义宏的作用
- 融资侦集档案—F档案001
- hdu 4198 杭电系列赛(四) BFS + 优先队列
- clearfix fixed hack
- xfire所用到的jar和server的粗略搭建
- 使用API获取(默认付款条件和到期日) .
- 实现strstr 函数
- C语言中格式化日期时间ctime()函数详细讲解
- 并查集剖析
- 把数据导入BOM清单
- 深入剖析C/C++函数的参数传递机制