[蓝桥杯训练] 第八届(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

posted @ 2018-03-27 20:40  In_Vincible  阅读(989)  评论(0编辑  收藏  举报