HDU 2822 Dogs【两次bfs】
6 6
..X...
XXX.X.
....X.
X.....
X.....
X.X...
3 5 6 3
如上一个图 告诉起点和终点 X到达不费力气 .到达花费1 问从起点到终点 最少的花费力气
分析:bfs 遇到X在bfs
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 const int maxn = 1005; 8 char s[maxn][maxn]; 9 int vis[maxn][maxn]; 10 int n, m; 11 int x0, y0, xn, yn; 12 13 struct Node { 14 int x, y, id; 15 bool operator<(const Node &n0) const{ 16 return id > n0.id; 17 } 18 }; 19 priority_queue<Node> q, qq; 20 21 int xx[4] = { 0, 0, 1, -1 }; 22 int yy[4] = { 1, -1, 0, 0 }; 23 24 bool bfs2(Node n0) { 25 while(!qq.empty()) { 26 qq.pop(); 27 } 28 qq.push(n0); 29 Node n2; 30 while(!qq.empty()) { 31 Node n1 = qq.top(); qq.pop(); 32 if(n1.x == xn && n1.y == yn) return true; 33 for(int i = 0; i < 4; i++) { 34 int tx = n1.x + xx[i]; 35 int ty = n1.y + yy[i]; 36 if(tx >= 0 && tx < n && ty >= 0 && ty < m && !vis[tx][ty] && s[tx][ty] == 'X') { 37 vis[tx][ty] = vis[n1.x][n1.y]; 38 n2.x = tx; n2.y = ty; n2.id = vis[tx][ty]; 39 qq.push(n2); 40 q.push(n2); 41 } 42 } 43 } 44 return false; 45 } 46 47 48 void bfs() { 49 while(!q.empty()) q.pop(); 50 memset(vis, 0, sizeof(vis)); 51 vis[x0][y0] = 1; 52 Node n0 = (Node) {x0, y0, vis[x0][y0]}; 53 q.push(n0); 54 if(s[x0][y0] == 'X') { 55 if(bfs2(n0)) return; 56 } 57 Node n2; 58 while(!q.empty()) { 59 Node n1 = q.top();q.pop(); 60 if(n1.x == xn && n1.y == yn) return ; 61 for(int i = 0; i < 4; i++) { 62 int tx = n1.x + xx[i]; 63 int ty = n1.y + yy[i]; 64 if(tx >= 0 && tx < n && ty >= 0 && ty < m && !vis[tx][ty]) { 65 if(s[tx][ty] == 'X') { 66 vis[tx][ty] = vis[n1.x][n1.y]; 67 n2.x = tx; n2.y = ty; n2.id = vis[tx][ty]; 68 if(bfs2(n2)) return ; 69 q.push(n2); 70 } else { 71 vis[tx][ty] = vis[n1.x][n1.y] + 1; 72 n2.x = tx; n2.y = ty; n2.id = vis[tx][ty]; 73 q.push(n2); 74 } 75 } 76 } 77 } 78 } 79 80 81 int main() { 82 while(scanf("%d %d",&n, &m) ) { 83 if(n == 0 && m == 0) break; 84 for(int i = 0; i < n; i++) { 85 scanf("%s",s[i]); 86 } 87 scanf("%d %d %d %d",&x0, &y0, &xn, &yn); 88 x0--; y0--; xn--; yn--; 89 bfs(); 90 printf("%d\n", vis[xn][yn] - 1); 91 } 92 return 0; 93 }
View Code
转载于:https://www.cnblogs.com/zhanzhao/p/4364015.html
HDU 2822 Dogs【两次bfs】相关推荐
- UVa 11624,两次BFS
题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...
- Fire!——两个BFS
[题目描述] [题目分析] 看到题目后很清楚是两个BFS,可是我觉得对于火的BFS可以转换成判断,我的做法是将火的位置全部记录下来,然后判断某个位置距离每个火的步数是否小于当前步数,可是错了,还不清楚 ...
- 专题训练二 搜索进阶 HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离)
HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离) Problem Description Last night, little erriyue had a horrible ...
- 2152 Balloons(两遍bfs求图的连通块)
2152 Balloons(两遍bfs求图的连通块) Problem Description Both Saya and Kudo like balloons. One day, they heard ...
- HDU 1043 Eight(双向BFS+康托展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
- HDU 5876 关于补图的bfs
1.HDU 5876 Sparse Graph 2.总结:好题,把STL都过了一遍 题意:n个点组成的完全图,删去m条边,求点s到其余n-1个点的最短距离. 思路:把点分为两个集合,A为所有没有到达 ...
- HDU(1175),连连看,BFS
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...
- HDU 1728 逃离迷宫(BFS的优化)
这一题,有两个地方需要注意:(除了题目令人窒息的行列的x y设置) ①转弯如何判断? 需要给转弯的方向赋值.通常,我们在节点向四个方向延伸的时候,喜欢这样 int nextx[4]={0,0,-1,1 ...
- HDU 1495 非常可乐(数论,BFS)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
最新文章
- 查询mysql上传大小限制_解决数据库phpmyadmin中上传最大限制:2,048 KB
- 互联网IP地址的分配
- 【计算摄影】图像美学专栏上线,先从学点摄影知识开始
- 小白的python进阶历程------01.初识python
- presentViewController和pushViewController
- vi中如何实现批量替换
- struts2 国际化资源文件自定义的路径解决方法
- 【工大SCIR笔记】AAAI 2020 故事结局预测任务上的区分性句子建模
- IIS6.0系统日志中出现此错误Timer_MinBytesPerSecond,Timer_ConnectionIdle
- 算法笔记 --- 布隆过滤器
- PostgreSQL使用函数实现merge功能
- kafkaStream执行过程中出现TimeoutException异常退出
- Qt_IOS环境搭建 Qt for ios Projector ERROR:This mkspec requires Xcode 4.3 or later
- OpenGL编程指南(红宝书)第九版使用指南
- linux系统如何重置密码
- Renesas:RH850G3KH 2.0内核简单知识整理
- Mac环境变量的配置
- C语言多种格式输入乘法表,C语言:九九乘法表打印
- 【CF802O】April Fools‘ Problem (hard)(wqs二分,模拟费用流,老鼠进洞)
- 触摸屏在环卫车辆上装控制系统的应用
热门文章
- Centos6.9部署ORTS5.0.22
- 8、泛型程序设计与c++标准模板库2.4列表容器
- 做一个java项目要经过那些正规的步骤
- WebRTC 音视频开发之路
- 合唱队(最长子序列问题)
- linux下的c编程
- 三个对CS最大的谬误
- windows server 2008解决无法PING通问题
- $(document).ready、body.Onload()和 $(window).load的区别
- 一段简单的模拟服务器的代码(Selector)