X星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。
我们假设玩家是面朝上坡的方向站立,则:
L表示走到左边的房间,
R表示走到右边的房间,
U表示走到上坡方向的房间,
D表示走到下坡方向的房间。
X星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!
开始的时候,直升机把100名玩家放入一个个小房间内。
玩家一定要按照地上的字母移动。
迷宫地图如下:
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
请你计算一下,最后,有多少玩家会走出迷宫? 而不是在里边兜圈子。
请提交该整数,表示走出迷宫的玩家数目。
package com.bean.algorithm.dfsbfs;
public class LRUDMaze {
static int ok = 0, res = 0;
static char road[][] = new char[][] {
{ 'U', 'D', 'D', 'L', 'U', 'U', 'L', 'R', 'U', 'L' },
{ 'U', 'U', 'R', 'L', 'L', 'L', 'R', 'R', 'R', 'U' },
{ 'R', 'R', 'U', 'U', 'R', 'L', 'D', 'L', 'R', 'D' },
{ 'R', 'U', 'D', 'D', 'D', 'D', 'U', 'U', 'U', 'U' },
{ 'U', 'R', 'U', 'D', 'L', 'L', 'R', 'R', 'U', 'U' },
{ 'D', 'U', 'R', 'L', 'R', 'L', 'D', 'L', 'R', 'L' },
{ 'U', 'L', 'L', 'U', 'R', 'L', 'L', 'R', 'D', 'U' },
{ 'R', 'D', 'L', 'U', 'L', 'L', 'R', 'D', 'D', 'D' },
{ 'U', 'U', 'D', 'D', 'U', 'D', 'U', 'D', 'L', 'L' },
{ 'U', 'L', 'R', 'D', 'L', 'U', 'U', 'R', 'R', 'R' }
};
static int cover[][] = new int[10][10];
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
for (int k = 0; k < 10; k++) {
ok = 0;
cover = new int[10][10];
dfs(i, k);
if (ok == 1) {
res++;
System.out.println(i+","+k); //输出能走出迷宫的人的坐标,方便检查结果
}
}
}
System.out.println(res);
}
static void dfs(int x, int y) {
if (x == -1 || x == 10 || y == -1 || y == 10) {
ok = 1;
return;
}
if (cover[x][y] == 1)
return;
cover[x][y] = 1;
if (road[x][y] == 'U') {
dfs(x - 1, y);
} else if (road[x][y] == 'D') {
dfs(x + 1, y);
} else if (road[x][y] == 'L') {
dfs(x, y - 1);
} else if (road[x][y] == 'R') {
dfs(x, y + 1);
}
}
}
程序运行结果
0,0
0,4
0,5
0,6
0,7
0,8
0,9
1,0
1,6
1,7
1,8
1,9
6,7
6,8
7,6
7,7
7,8
7,9
8,2
8,3
8,6
8,7
8,8
8,9
9,2
9,3
9,4
9,6
9,7
9,8
9,9
31