• hihocoder 1519 : 逃离迷宫II


    题目链接

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    小Hi被坏女巫抓进里一间有N x M个格子组成的矩阵迷宫。

    有些格子是小Hi可以经过的,我们用'.'表示;有些格子上有障碍物小Hi不能经过,我们用'#'表示。小Hi的起始位置用'S'表示,他需要到达用'T'表示的格子才能逃离迷宫。

    麻烦的是小Hi被坏女巫施了魔法,他只能选择上下左右某一个方向,沿着这个方向一直走,直到遇到障碍物或者迷宫边界才能改变方向。新的方向可以是上下左右四个方向之一。之后他还是只能沿着新的方向一直走直到再次遇到障碍物或者迷宫边界……  

    小Hi想知道他最少改变几次方向才能逃离这个迷宫。

    输入

    第一行包含两个整数N和M。  (1 <= N, M <= 500)  

    以下N行每行M个字符,代表迷宫。

    输出

    一个整数代表答案。如果小Hi没法逃离迷宫,输出-1。

    样例输入
    5 5
    S.#.T  
    .....  
    .....  
    .....  
    .....
    样例输出
    2

    题目有个地方感觉很坑,就是没有真正告诉过你路过也可以算到达终点,反而题目中 “直到遇到障碍物或者迷宫边界才能改变方向” 误导性可以说是非常坏坏了。BFS。

    ac代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<vector>
     5 #include<set>
     6 #include<algorithm>
     7 #include<queue>
     8 
     9 using namespace std;
    10 
    11 const int maxn = 505;
    12 char map[maxn][maxn];
    13 bool visit[maxn][maxn];
    14 int dir[4][2] = { 0,1,0,-1,1,0,-1,0 };
    15 int res;
    16 int n, m;
    17 
    18 struct node {
    19     int i;
    20     int j;
    21     int cnt;
    22     node(){}
    23     node(int ii, int jj, int c) : i(ii), j(jj), cnt(c) {};
    24 };
    25 queue<node> q;
    26 int findway(node s)        //bfs
    27 {
    28     visit[s.i][s.j] = true;
    29     q.push(s);
    30 
    31     while (!q.empty())
    32     {
    33         node f = q.front();
    34         q.pop();
    35 
    36         for (int i = 0; i < 4; i++) {
    37             int nexti = f.i + dir[i][0];
    38             int nextj = f.j + dir[i][1];
    39 
    40             while (map[nexti][nextj] != '#'&&nexti >= 0 && nexti < n&&nextj >= 0 && nextj < m)
    41             {
    42                 if (map[nexti][nextj] == 'T')
    43                     return f.cnt+1;
    44                 nexti += dir[i][0];
    45                 nextj += dir[i][1];
    46             }
    47             nexti -= dir[i][0];
    48             nextj -= dir[i][1];
    49             if (visit[nexti][nextj] == false)
    50             {
    51                 node nextnode = node(nexti, nextj, f.cnt + 1);
    52                 visit[nexti][nextj] = true;
    53                 q.push(nextnode);
    54             }
    55         }
    56     }
    57     return -1;
    58 }
    59 
    60 int main()
    61 {    
    62     memset(map, '0', sizeof(map));    
    63     memset(visit, false, sizeof(visit));
    64     cin >> n >> m;
    65     node s;
    66     int si, sj;
    67     for (int i = 0;i < n;i++)
    68         for (int j = 0;j < m;j++) {
    69             cin >> map[i][j];
    70             if (map[i][j] == 'S')
    71             {
    72                 visit[i][j] = true;
    73                 s.i = i;
    74                 s.j = j;
    75                 s.cnt = -1;
    76             }                
    77         }    
    78     cout << findway(s) << endl;
    79     return 0;
    80 }
  • 相关阅读:
    扩展欧几里得
    Android中进行流量统计
    经常使用的DB2命令(2)
    构建下一代服务载体,智能设备这座宝藏该怎么挖?
    Oracle 11g新特性虚拟列分区
    Convert Sorted List to Binary Search Tree
    c#高效的线程安全队列ConcurrentQueue<T>(上)
    String、StringBuffer与StringBuilder之间区别
    C# 中的委托和事件
    利用C#自带组件强壮程序日志
  • 原文地址:https://www.cnblogs.com/weedboy/p/7082209.html
Copyright © 2020-2023  润新知