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