• Hdu 1072 【广搜】.cpp


    题意:

      给出一个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

  • 相关阅读:
    解决npm 下载速度慢的问题
    mongodb可视化工具mongobooster
    页面响应时间测试
    pyH支持python3
    python正则表达式
    Windows下TeX Live + Sublime Text 3 + Sumatra PDF配置
    Octocat,看着喜欢就都下载下来了
    [c#]记一次实验室局域网的ARP欺骗
    [FQ]Tor + Chrome + PAC 尝试 FQ
    [c#][福利]BTTool种子文件修改工具
  • 原文地址:https://www.cnblogs.com/Griselda/p/3122681.html
Copyright © 2020-2023  润新知