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】相关推荐

  1. UVa 11624,两次BFS

    题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...

  2. Fire!——两个BFS

    [题目描述] [题目分析] 看到题目后很清楚是两个BFS,可是我觉得对于火的BFS可以转换成判断,我的做法是将火的位置全部记录下来,然后判断某个位置距离每个火的步数是否小于当前步数,可是错了,还不清楚 ...

  3. 专题训练二 搜索进阶 HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离)

    HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离) Problem Description Last night, little erriyue had a horrible ...

  4. 2152 Balloons(两遍bfs求图的连通块)

    2152 Balloons(两遍bfs求图的连通块) Problem Description Both Saya and Kudo like balloons. One day, they heard ...

  5. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  6. HDU 5876 关于补图的bfs

    1.HDU 5876  Sparse Graph 2.总结:好题,把STL都过了一遍 题意:n个点组成的完全图,删去m条边,求点s到其余n-1个点的最短距离. 思路:把点分为两个集合,A为所有没有到达 ...

  7. HDU(1175),连连看,BFS

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...

  8. HDU 1728 逃离迷宫(BFS的优化)

    这一题,有两个地方需要注意:(除了题目令人窒息的行列的x y设置) ①转弯如何判断? 需要给转弯的方向赋值.通常,我们在节点向四个方向延伸的时候,喜欢这样 int nextx[4]={0,0,-1,1 ...

  9. HDU 1495 非常可乐(数论,BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

最新文章

  1. 查询mysql上传大小限制_解决数据库phpmyadmin中上传最大限制:2,048 KB
  2. 互联网IP地址的分配
  3. 【计算摄影】图像美学专栏上线,先从学点摄影知识开始
  4. 小白的python进阶历程------01.初识python
  5. presentViewController和pushViewController
  6. vi中如何实现批量替换
  7. struts2 国际化资源文件自定义的路径解决方法
  8. 【工大SCIR笔记】AAAI 2020 故事结局预测任务上的区分性句子建模
  9. IIS6.0系统日志中出现此错误Timer_MinBytesPerSecond,Timer_ConnectionIdle
  10. 算法笔记 --- 布隆过滤器
  11. PostgreSQL使用函数实现merge功能
  12. kafkaStream执行过程中出现TimeoutException异常退出
  13. Qt_IOS环境搭建 Qt for ios Projector ERROR:This mkspec requires Xcode 4.3 or later
  14. OpenGL编程指南(红宝书)第九版使用指南
  15. linux系统如何重置密码
  16. Renesas:RH850G3KH 2.0内核简单知识整理
  17. Mac环境变量的配置
  18. C语言多种格式输入乘法表,C语言:九九乘法表打印
  19. 【CF802O】April Fools‘ Problem (hard)(wqs二分,模拟费用流,老鼠进洞)
  20. 触摸屏在环卫车辆上装控制系统的应用

热门文章

  1. Centos6.9部署ORTS5.0.22
  2. 8、泛型程序设计与c++标准模板库2.4列表容器
  3. 做一个java项目要经过那些正规的步骤
  4. WebRTC 音视频开发之路
  5. 合唱队(最长子序列问题)
  6. linux下的c编程
  7. 三个对CS最大的谬误
  8. windows server 2008解决无法PING通问题
  9. $(document).ready、body.Onload()和 $(window).load的区别
  10. 一段简单的模拟服务器的代码(Selector)