标题:迷宫
X星球的一处迷宫游乐场建在某个小山坡上。
它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。
我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R表示走到右边的房间,U表示走到上坡方向的房间,D表示走到下坡方向的房间。X星球的居民有点懒,不愿意费力思考。
他们更喜欢玩运气类的游戏。这个游戏也是如此!开始的时候,直升机把100名玩家放入一个个小房间内。
玩家一定要按照地上的字母移动。迷宫地图如下:
------------UDDLUULRULUURLLLRRRURRUURLDLRDRUDDDDUUUUURUDLLRRUUDURLRLDLRLULLURLLRDURDLULLRDDDUUDDUDUDLLULRDLUURRR------------请你计算一下,最后,有多少玩家会走出迷宫?
而不是在里边兜圈子。请提交该整数,表示走出迷宫的玩家数目,不要填写任何多余的内容。
如果你还没明白游戏规则,可以参看一个简化的4x4迷宫的解说图:
思路: 此题难点在于怎么判断该玩家是否会陷入死循环,从而走不出来。 我们可以设置一个vis[12][12],vis[i][j]用于标记地图上的某点(i, j)走过的次数,当改点走过的次数大于1时,说明又绕了回来,也即陷入死循环走不出来。
1 #include2 #include 3 #include 4 #include 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