zoukankan      html  css  js  c++  java
  • 蓝桥杯 迷宫

    标题:迷宫

    X星球的一处迷宫游乐场建在某个小山坡上。
    它是由10x10相互连通的小房间组成的。

    房间的地板上写着一个很大的字母。
    我们假设玩家是面朝上坡的方向站立,则:
    L表示走到左边的房间,
    R表示走到右边的房间,
    U表示走到上坡方向的房间,
    D表示走到下坡方向的房间。

    X星球的居民有点懒,不愿意费力思考。
    他们更喜欢玩运气类的游戏。这个游戏也是如此!

    开始的时候,直升机把100名玩家放入一个个小房间内。
    玩家一定要按照地上的字母移动。

    迷宫地图如下:
    ------------
    UDDLUULRUL
    UURLLLRRRU
    RRUURLDLRD
    RUDDDDUUUU
    URUDLLRRUU
    DURLRLDLRL
    ULLURLLRDU
    RDLULLRDDD
    UUDDUDUDLL
    ULRDLUURRR
    ------------

    请你计算一下,最后,有多少玩家会走出迷宫?
    而不是在里边兜圈子。

    请提交该整数,表示走出迷宫的玩家数目,不要填写任何多余的内容。

    如果你还没明白游戏规则,可以参看一个简化的4x4迷宫的解说图:

     

    思路: 此题难点在于怎么判断该玩家是否会陷入死循环,从而走不出来。 我们可以设置一个vis[12][12],vis[i][j]用于标记地图上的某点(i, j)走过的次数,当改点走过的次数大于1时,说明又绕了回来,也即陷入死循环走不出来。

     1 #include<iostream> 
     2 #include<algorithm>
     3 #include<queue>
     4 #include<cstring>
     5 
     6 using namespace std;
     7 
     8 char mp[12][12] = {
     9     "UDDLUULRUL",
    10     "UURLLLRRRU",
    11     "RRUURLDLRD",
    12     "RUDDDDUUUU",
    13     "URUDLLRRUU",
    14     "DURLRLDLRL",
    15     "ULLURLLRDU",
    16     "RDLULLRDDD",
    17     "UUDDUDUDLL",
    18     "ULRDLUURRR" };
    19 
    20 int vis[12][12];
    21 int x, y;
    22 int result;
    23 
    24 int main()
    25 {
    26     for (int i = 0; i < 10; ++i)
    27     {
    28         for (int j = 0; j < 10; ++j)
    29         {
    30             memset(vis, 0, sizeof(vis));    //一定要记得重置!
    31             x = i;
    32             y = j;
    33             ++vis[x][y];
    34             while (1)
    35             {
    36                 if (mp[x][y] == 'U')
    37                     --x;
    38                 else if (mp[x][y] == 'D')
    39                     ++x;
    40                 else if (mp[x][y] == 'L')
    41                     --y;
    42                 else if (mp[x][y] == 'R')
    43                     ++y;
    44 
    45                 if (x < 0 || x >= 10 || y < 0 || y >= 10)  //走出来了
    46                 {
    47                     ++result;
    48                     break;
    49                 }
    50                 
    51                 ++vis[x][y];
    52                 
    53                 if (vis[x][y] > 1)    //又绕了回来,即陷入了死循环走不出来
    54                     break;
    55             }
    56         }
    57     }
    58 
    59     cout << result << endl;
    60 
    61     return 0;
    62 }

    答案: 31

  • 相关阅读:
    第七单元
    第六单元
    第五单元
    第四单元
    第三章
    第二单元
    第一单元
    单词
    机器学习和模式识别的区别
    TODO-项目
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10496905.html
Copyright © 2011-2022 走看看