zoukankan      html  css  js  c++  java
  • hdoj1072 Nightmare(bfs)

    题目大意:

    在迷宫中有一个炸弹,过六个单位时间就会爆炸,要你求一个起点到迷宫的终点的最短距离,迷宫中有时间重置器,当你走到这个格子,炸弹的爆炸时间重新置为0,迷宫中标识为墙壁的格子不能走,到达任意一个格子时,炸弹计数器为0时,则失败。

    求逃出迷宫最短距离,bfs。

    但是有两个限制条件,1.求最短,2.炸弹时间不小于1(等于零不OK)。

    解锁bfs新姿势。(赞!

     1 #include<iostream>
     2 #include<cstring>
     3 #include<queue>
     4 #define maxn 10
     5 using namespace std;
     6 const int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
     7 int map[maxn][maxn],V[maxn][maxn];
     8 struct point{
     9     int x,y;
    10     int temp,time; // 步数,剩余时间 
    11 }start;
    12 int ans,n,m;
    13 int bfs(){
    14     queue<point> Q;
    15     Q.push(start);
    16     while (!Q.empty()){
    17         point pre=Q.front();
    18         if (map[pre.x][pre.y]==3 && pre.time>0){
    19             ans=pre.temp;
    20             return 1;
    21         }
    22         Q.pop();
    23         for (int i=0;i<4;i++){
    24             point next;
    25             next.x=pre.x+dx[i];
    26             next.y=pre.y+dy[i];
    27             next.temp=pre.temp+1;
    28             next.time=pre.time-1;
    29             if (next.x<0 || next.x>=n || next.y<0 || next.y>=m || next.time<=0 || map[next.x][next.y]==0) continue;
    30             if (map[next.x][next.y]==3){
    31                 ans=next.temp;
    32                 return 1;
    33             }
    34             else if (map[next.x][next.y]==4){
    35                 next.time=6;
    36                 map[next.x][next.y]=0;
    37             }
    38             Q.push(next);
    39         }
    40     }
    41     return 0;
    42 }
    43 int main(){
    44     int t;
    45     cin >> t;
    46     while (t--){
    47         cin >> n >> m;
    48         for (int i=0;i<n;i++){
    49             for (int j=0;j<m;j++){
    50                 cin >> map[i][j];
    51                 if (map[i][j]==2){
    52                     start.x=i;
    53                     start.y=j;
    54                     start.temp=0;
    55                     start.time=6;
    56                 }
    57             }
    58         }
    59         memset(V,0,sizeof(V));
    60         ans=0;
    61         if (bfs()) cout << ans << endl;
    62         else cout << -1 << endl;
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    mysql sql语句大全
    windows composer 安装,使用新手入门
    PHP 变量类型的强制转换 & 创建空对象
    window bat 运行 cmd 命令
    window apidoc的安装和使用
    linux apidoc的安装和使用
    RabbitMQ的安装与基本使用
    控制流之continue
    控制流之break
    控制流之while
  • 原文地址:https://www.cnblogs.com/changer-qyz/p/8486357.html
Copyright © 2011-2022 走看看