• [蓝桥杯训练] 第八届(2017)省赛 C/C++ A组 T01


    1. 题目

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

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

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

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

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

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

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

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

    2. 分析

    第一题,分是白送的,跑一个模拟就可以解决

    2.1 如何定义“走得出”与“走不出”

    显然,走得出的定义是:离开了这个矩阵。

    而走不出的定义是:(无论走多少步都)离不开这个矩阵。

    于是我们可以得到一个非常简单的方法:

    构造一个10*10的数组和一个临时位置pos(x,y),对与每个位置进行一次模拟,如果能够在某一步,pos(x,y)的x或y发生越界,即x或y在某一步大于9或小于0,就算走出迷宫。

    而对于走不出的情况,显然是因为走到了曾经走过的位置,陷入了infinite loop,导致永远无法走出。

    3. 程序

     1 #include <iostream>
     2 #include <sstream>
     3 #include <algorithm>
     4 #include <vector>
     5 #include <set>
     6 #include <list>
     7 #include <map>
     8 #include <cmath>
     9 #include <cstring>
    10 #include <cstdlib>
    11 
    12 #define U 0
    13 #define D 1
    14 #define R 2
    15 #define L 3
    16 
    17 using namespace std;
    18 
    19 #define DEBUG 0
    20 
    21 int maze[10][10]= 
    22 {
    23 {U,D,D,L,U,U,L,R,U,L},
    24 {U,U,R,L,L,L,R,R,R,U},
    25 {R,R,U,U,R,L,D,L,R,D},
    26 {R,U,D,D,D,D,U,U,U,U},
    27 {U,R,U,D,L,L,R,R,U,U},
    28 {D,U,R,L,R,L,D,L,R,L},
    29 {U,L,L,U,R,L,L,R,D,U},
    30 {R,D,L,U,L,L,R,D,D,D},
    31 {U,U,D,D,U,D,U,D,L,L},
    32 {U,L,R,D,L,U,U,R,R,R},
    33 };   //Our maze
    34 
    35 int main() {
    36     int count=0;
    37     for (int i = 0; i<10; i++) {
    38         for (int j =0; j<10; j++) {   //遍历迷宫的每一个格
    39             int codX=j,codY=i;        //将pos(x,y)设置为起点
    40             int visited[10][10];      //构造一个记录矩阵
    41             memset(visited,0,100*sizeof(int));   //全部初始化为0
    42             while ( true )    {
    43                 if ( maze[codY][codX] == U ) {
    44                     visited[codY][codX] = 1;  
    45                     if ( codY>0 ) {
    46                         if (visited[codY-1][codX]) break;    //下一个位置已经走过,陷入死循环,不能走出迷宫
    47                         else codY--;
    48                     }
    49                     else { //已经走出,计数加1
    50                         count++;
    51                         break;
    52                     }
    53                 }
    54                 else if ( maze[codY][codX] == D ) {
    55                     visited[codY][codX] = 1;
    56                     if ( codY<9 ) {
    57                         if (visited[codY+1][codX]) break;
    58                         else codY++;
    59                     }
    60                     else {
    61                         count++;
    62                         break;
    63                     }
    64                 }
    65                 else if ( maze[codY][codX] == L ) {
    66                     visited[codY][codX] = 1;
    67                     if ( codX>0 ) {
    68                         if (visited[codY][codX-1]) break;                        
    69                         else codX--;
    70                     }
    71                     else {
    72                         count++;
    73                         break;
    74                     }
    75                 }
    76                 else if ( maze[codY][codX] == R ) {
    77                     visited[codY][codX] = 1;
    78                     if ( codX<9 ) {
    79                         if (visited[codY][codX+1]) break;
    80                         else codX++;
    81                     }
    82                     else {
    83                         count++;
    84                         break;
    85                     } 
    86                 }
    87             }
    88             
    89         }
    90     }
    91     printf("%d",count); //输出可以走出迷宫的总数
    92     return 0;
    93 }

    4. 运行结果

    答案:31

  • 相关阅读:
    75.Java异常处理机制-自定义异常
    75.Java异常处理机制-手动抛出异常
    75.Java异常处理机制throws
    mybatis的xml文件中如何处理大小于号
    JS 拼装代码的HTML onClick方法传递字符串
    Java 日期往后推迟n天
    MySql 去重且指定某字段在前的排序方法
    java运行内存分配图(转)
    Java中正则Matcher类的matches()、lookAt()和find()的区别<转>
    图片在父元素中上下居中(vertical-align的有效性)
  • 原文地址:https://www.cnblogs.com/sser-invincible/p/8660007.html
Copyright © 2020-2023  润新知