zoukankan      html  css  js  c++  java
  • [Swust OJ 1023]--Escape(带点其他状态的BFS)

    解题思路:http://acm.swust.edu.cn/problem/1023/

    Time limit(ms): 5000        Memory limit(kb): 65535
     
     
    Description

    BH is in a maze,the maze is a matrix,he wants to escape!

     
    Input

    The input consists of multiple test cases.

    For each case,the first line contains 2 integers N,M( 1 <= N, M <= 100 ).

    Each of the following N lines contain M characters. Each character means a cell of the map.

    Here is the definition for chracter.

    For a character in the map: 

    'S':BH's start place,only one in the map.

    'E':the goal cell,only one in the map.

    '.':empty cell.

    '#':obstacle cell.

    'A':accelerated rune.

    BH can move to 4 directions(up,down,left,right) in each step.It cost 2 seconds without accelerated rune.When he get accelerated rune,moving one step only cost 1 second.The buff lasts 5 seconds,and the time doesn't stack when you get another accelerated rune.(that means in anytime BH gets an accelerated rune,the buff time become 5 seconds).

     
     
    Output

    The minimum time BH get to the goal cell,if he can't,print "Please help BH!".

     
    Sample Input
    5 5
    ....E
    .....
    .....
    ##...
    S#...
     
    5 8
    ........
    ........
    ..A....A
    A######.
    S......E

    Sample Output
    Please help BH!
    12

     

    由于OJ上传数据的BUG,换行请使用" ",非常抱歉

    题目大意:一个迷宫逃离问题,只是有了加速符A,正常情况下通过一个格子2s,有了加速符只要1s,并且加速符持续5s,‘S'代表起点

         'E'代表终点,'#'代表障碍,'.'空格子,能够逃离输出最少用时,否则输出"Please help BH!"

    解题思路:BFS,用一个3维dp数组存贮,每一点在不同加速状态下的值,然后筛选dp数组终点的最小值即可

    代码如下:

     1 #include <iostream>
     2 #include <cstring>
     3 #include <queue>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 #define maxn 101
     8 #define inf 0x3f3f3f3f
     9 
    10 int dir[][2] = { 1, 0, 0, 1, -1, 0, 0, -1 };
    11 int dp[maxn][maxn][6];
    12 int sx, sy, ex, ey, n, m;
    13 char map[maxn][maxn];
    14 
    15 struct node{
    16     int x, y, step, speed;//spead加速
    17 };
    18 void bfs(){
    19     node now, next;
    20     now.x = sx, now.y = sy, now.step = 0, now.speed = 0;
    21     dp[sx][sy][0] = 0;
    22     queue<node>Q;
    23     Q.push(now);
    24     while (!Q.empty()){
    25         now = Q.front(); Q.pop();
    26         for (int i = 0; i < 4; i++){
    27             next = now;
    28             next.x += dir[i][0];
    29             next.y += dir[i][1];
    30             if (next.x < 0 || next.x >= n || next.y < 0 || next.y >= m || map[next.x][next.y] == '#')continue;//不可行状态
    31             if (next.speed){
    32                 //加速效果
    33                 next.speed--;
    34                 next.step++;
    35             }
    36             else next.step += 2;
    37             if (map[next.x][next.y] == 'A')next.speed = 5;//获得加速神符
    38             if (next.step < dp[next.x][next.y][next.speed]){
    39                 dp[next.x][next.y][next.speed] = next.step;
    40                 Q.push(next);
    41             }
    42         }
    43     }
    44     int ans = inf;
    45     for (int i = 4; i >= 0; i--)
    46         ans = min(ans, dp[ex][ey][i]);
    47     if (ans >= inf)
    48         cout << "Please help BH!
    ";
    49     else
    50         cout << ans << "
    ";
    51 }
    52 int main(){
    53     while (cin >> n >> m){
    54         memset(dp, inf, sizeof dp);
    55         for (int i = 0; i < n; i++){
    56             cin >> map[i];
    57             for (int j = 0; j < m; j++){
    58                 if (map[i][j] == 'S')sx = i, sy = j;
    59                 if (map[i][j] == 'E')ex = i, ey = j;
    60             }
    61         }
    62         bfs();
    63     }
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    [Cordova] 无法编译Visual Studio项目里Plugin副本的Native Code
    [Cordova] 无法显示Alert视窗
    [ASP.NET MVC] 使用CLK.AspNet.Identity提供依权限显示选单项目的功能
    [Tool] SourceTree初始化GitFlow遇到错误(git command not found)的解决方案
    [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)
    [AngularJS] 使用AngularCSS动态加载CSS
    [AngularJS] 使用AngularAMD动态加载Service
    [AngularJS] 使用AngularAMD动态加载Controller
    [Tool] Chrome内的本地网页,使用XMLHttpRequest读取本地档案
    [Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案
  • 原文地址:https://www.cnblogs.com/zyxStar/p/4593378.html
Copyright © 2011-2022 走看看