zoukankan      html  css  js  c++  java
  • hdu 1072 Nightmare(dfs)(转)

    这个代码思路比较清晰。

    大意:在n×m的地图上,0表示墙,1表示空地,2表示人3表示目的地,4表示有炸弹重启器。炸弹的时间是6,人走一步所需要的时间是1。每次可以上、下、左、右移动一格。当人走到4时如果炸弹的时间不是0,可以重新设定炸弹的时间为6。如果人走到3而炸弹的时间不为0时,成功走出。求人从2走到3的最短时间。这里当走过了4以后就不要重新返回到4,我们把4设为0不能再走;其余的走过后,不进行标记,也就是说他后面还有可能走到这个位置,可能会出现死循环,然而事实不是如此,还没等到你出现,他就return要充分利用到队列和广搜的性质。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <queue>
     4 using namespace std;
     5 const int N = 10;
     6 int map[N][N], n, m, starti, startj;
     7 int dir[][2] = {{-1,0}, {0,1}, {1,0}, {0,-1}};
     8 struct Node
     9 {
    10     int x, y, curtime, bombtime;
    11 };
    12 int dfs()
    13 {
    14     queue<Node> q;
    15     Node now, next;
    16     now.x = starti, now.y = startj, now.curtime = 0, now.bombtime = 6;
    17     q.push(now);
    18     map[now.x][now.y] = 0;
    19     while (!q.empty())
    20     {
    21         now = q.front();
    22         q.pop();
    23         for (int i = 0; i < 4; ++i)
    24         {
    25             next.x = now.x + dir[i][0];
    26             next.y = now.y + dir[i][1];
    27             if (next.x>=0 && next.x<n && next.y>=0 && next.y<m &&
    28                     map[next.x][next.y] != 0 && now.bombtime > 1)
    29             {
    30                 if (map[next.x][next.y] == 3)
    31                     return now.curtime + 1;
    32                 else if (map[next.x][next.y] == 1)
    33                 {
    34                     next.curtime = now.curtime + 1;
    35                     next.bombtime = now.bombtime - 1;
    36                     q.push(next);
    37                 }
    38                 else if (map[next.x][next.y] == 4)
    39                 {
    40                     next.curtime = now.curtime + 1;
    41                     next.bombtime = 6;
    42                     q.push(next);
    43                     map[next.x][next.y] = 0;
    44                 }
    45             }
    46         }
    47     }
    48     return -1;
    49 }
    50 int main()
    51 {
    52     int t;
    53     scanf("%d", &t);
    54     while (t--)
    55     {
    56         scanf("%d %d", &n, &m);
    57         for (int i = 0; i < n; ++i)
    58             for (int j = 0; j < m; ++j)
    59             {
    60                 scanf("%d", &map[i][j]);
    61                 if (map[i][j] == 2)
    62                     starti = i, startj = j;
    63             }
    64         printf("%d\n", dfs());
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    HTTP协议
    python中os模块简介
    什么是HTML
    Django框架
    python递归
    web工程中的各种路径(eclipse开发)
    小白向:web中利用request.getPart()上传文件到服务器
    利用 html+css 画同心圆(concentric circles)——绝对布局与相对布局
    理解z-index和css中的层叠顺序问题(大神技术博的读后感?)
    二、系统初始化
  • 原文地址:https://www.cnblogs.com/PegasusWang/p/3088525.html
Copyright © 2011-2022 走看看