题意:

  给出一个n*m的矩阵,

  0 表示不可走

  1 表示可走

  2 表示起点

  3 表示终点

  4 表示可走且走到这一步可以满血

  某人一开始有6滴血,走一步少一滴..到0就死了..

  可以走到4的位置满血再走..

  求出最少走几步可以从起点到终点..

  

思路:

  广搜,用一个cnt表示现在走了几步,一个cur表示现在的血量..

  普通的广搜过程中如果已经走过就不可以再走了..但是第三个样例可以看出走过还可以再走..

  因为普通广搜走过不能再走只是代表这个状态已经访问过了..不需要再次访问,防止死循环..

  但是现在再次访问的时候因为血量已经不一样了.所以可以再走..

  

  剩下就是正常广搜了..

Tips:

  404..

Code:

 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int MAXN = 10;
 8 const int INF = 0x1f1f1f1f;
 9
10 struct Node
11 {
12     int x;
13     int y;
14     int cnt;
15     int cur;
16 };
17
18 int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
19 int iCase, n, m;
20 int G[MAXN][MAXN], vis[MAXN][MAXN], dis[MAXN][MAXN];
21
22 bool check(Node node)
23 {
24     return node.x >= 0 && node.x < n && node.y >= 0 && node.y < m && (!vis[node.x][node.y] || dis[node.x][node.y] < node.cur) && node.cur != 0;
25 }
26
27 /*
28 0 wall
29 1 nothing
30 2 start
31 3 end
32 4 reset
33 */
34
35 int main()
36 {
37    // freopen("in.txt", "r", stdin);
38     bool flag;
39     Node ed, node, node1;
40     int ans;
41     scanf("%d", &iCase);
42     while (iCase--) {
43         memset(vis, false, sizeof(vis));
44         memset(dis, INF, sizeof(dis));
45         flag = false;
46         queue<Node> Q;
47         scanf("%d %d", &n, &m);
48         for (int i = 0; i < n; ++i)
49             for (int j = 0; j < m; ++j) {
50                 scanf("%d", &G[i][j]);
51                 if (G[i][j] == 2) {
52                     node.x = i, node.y = j;
53                     node.cnt = 0;
54                     node.cur = 6;
55                     Q.push(node);
56                     dis[i][j] = node.cur;
57                     vis[i][j] = true;
58                 } else if (G[i][j] == 3)
59                     ed.x = i, ed.y = j;
60                 else if (G[i][j] == 0)
61                     vis[i][j] = true;
62         }
63         while (!Q.empty()) {
64             node  = Q.front();
65             if (node.x == ed.x && node.y == ed.y) {
66                 ans = node.cnt;
67                 flag = true;
68                 break;
69             }
70             Q.pop();
71             for (int i = 0; i < 4; ++i) {
72                 node1.x = node.x+dir[i][0];
73                 node1.y = node.y+dir[i][1];
74                 node1.cnt = node.cnt+1;
75                 node1.cur = node.cur-1;
76                 if (check(node1)) {
77                     if (G[node1.x][node1.y] == 4) node1.cur = 6;
78                     dis[node1.x][node1.y] = node.cur;
79                     Q.push(node1);
80                     vis[node1.x][node1.y] = true;
81                 }
82             }
83         }
84         if (flag) printf("%d\n", ans);
85         else puts("-1");
86     }
87     return 0;
88 }

View Code

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072

转载于:https://www.cnblogs.com/Griselda/archive/2013/06/06/3122681.html

Hdu 1072 【广搜】.cpp相关推荐

  1. POJ 3278 / hdu 2717 Catch That Cow (广搜)

    POJ 3278 HDU 2717 广搜题,用一个数组标记就可以过,不标记的话会超内存. 另外,poj的数据要比hdu强一些,比如0 100,这种数据.不特判的话会RE.不过如果不特判,在poj上用C ...

  2. [HDU] 2612 Find a way - 用单源最短论经模拟的简单广搜

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2612 方法:其实就是从两个点分别探寻单源最短路径,两个点到同一个目标位置的最短路径都求出来,相加,然 ...

  3. [HDU] 1181 变形课-简单建模后广搜

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1181 方法:以所有咒语看做一条起点为首字母,终点为末字母的有向边来建立有向图.然后在图中判断目标路径 ...

  4. A strange lift HDU - 1548(基础广搜)

    There is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 ...

  5. hdu 2612 Find a way (广搜)

    Problem Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. L ...

  6. hdu 1253 胜利大逃亡 (广搜)

    题目链接 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个ABC的立方体,可以被表示成A个 ...

  7. poj 3278 Catch That Cow 广搜

    hdu 2717 Catch That Cow,题目链接 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...

  8. 双向广搜 8数码问题

     转载自:http://blog.sina.com.cn/s/blog_8627bf080100ticx.html  Eight 题目链接:http://acm.hdu.edu.cn/showprob ...

  9. 提高篇 第一部分 基础算法 第4章 广搜的优化技巧

    LOJ 一本通一句话题解系列: - ~victorique~ - 博客园 LOJ 一本通一句话题解系列: - ~victorique~ - 博客园 「一本通 1.4 例 1」电路维修 电路维修 (广搜 ...

最新文章

  1. elasticsearch 集群在线水平扩容收缩
  2. java多态口诀,Java之路---Day12(多态),多态Java
  3. WSDM 2022 | 基于元学习的多场景多任务商家建模
  4. js template换行_JavaScript字符串换行符?
  5. 一面微创题--字符串逆序输出
  6. Git - 推送当前分支快捷方式
  7. 计算某日是该年的第几天
  8. vs2015+opencv+dilb+于仕琪人类识别算法对人脸特征点进行检测
  9. excel如何选中空单元格并计算总计、平均值、率
  10. RAC-iOS中基本用法
  11. Linux 安装WinUSB
  12. 发生错误,无法导入项目(不能取回此项的内容)
  13. Linux 查看tomcat占用的端口号
  14. SimpleRNN实现股票预测
  15. BootStrap中修改navbar导航条的默认高度
  16. 计算机毕业设计基于安卓/微信小程序的健身房健身管理系统
  17. 电脑启动多个微信的方法
  18. openid和unionid的区别
  19. mapbox地图动画一键飞行
  20. 值得收藏的35+ 免费Javascript /Flash相册

热门文章

  1. Linux du指令
  2. Linux shell脚本附带选项(参数传递及接收)
  3. 请讲一下浏览器从接收到一个URL,到最后展示出页面,经历了哪些过程
  4. spring mvc工作原理及组件说明
  5. 多级缓存中的一级缓存全网流量分发CDN
  6. 使用jQuery OCUpload实现excel文件一键上传功能
  7. 列表根据下标取值_Python基础知识点——list(列表)讲解
  8. bios设置_大白菜U盘启动BIOS设置教程
  9. JavaSE、JavaEE、JavaME、jdk、jre、jvm、java主要的11个特性
  10. 人体识别_深度学习资讯 | 用于人体动作识别的26层卷积神经网络