标题:迷宫
X星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成
的。房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:
L表示走到左边的房间,R表示走到右边的房间,
U表示走到上坡方向的房间,D表示走到下坡方向的房间。
X星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!
开始的时候,直升机把100名玩家放入一个个小房间内。玩家一定要按照地上的字母移动。
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
请你计算一下,最后,有多少玩家会走出迷宫? 而不是在里边兜圈子。
请提交该整数,表示走出迷宫的玩家数目,不要填写任何多余的内容
解题思路:
针对这道题目,首先想到的是DFS,对每个房间进行遍历,按照规则走,
走到下一个房间可能会出现以下三情况:
1、该玩家走出迷宫。
2、该玩家回到被访问过的房间,无法走出迷宫。
3、下一个房间未被访问过,按照房间指示继续走。
只要弄清楚这三情况,题目就迎刃而解。
参照下面代码:
package test;
public class Maze {
static char[][] array = new char[10][10];
static boolean[][] vis = new boolean[10][10];//表示该房间是否被访问过
static int count = 0;//计数走出迷宫的玩家
//对布尔数组中的每个元素初始化,表示该房间没被访问
public static void init() {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
vis[i][j] = false;
}
}
}
public static void main(String[] args) {
String str = "UDDLUULRUL" +
"UURLLLRRRU" +
"RRUURLDLRD" +
"RUDDDDUUUU" +
"URUDLLRRUU" +
"DURLRLDLRL" +
"ULLURLLRDU" +
"RDLULLRDDD" +
"UUDDUDUDLL" +
"ULRDLUURRR";
//将创建好的字符串中的字符按顺序存放到数组中
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
array[i][j] = str.charAt(i * 10 + j);
System.out.print(array[i][j]);
}
System.out.println();
}
//进行深度优先搜索(DFS) 一条路走到黑
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {//对每一个元素进行遍历
int x = i;
int y = j;
init();
//每个方格的玩家最终只有两种可能,要么是走出去,要么回到被访问过的房间无限循环
while (true) {//定义一个死循环
//1、该玩家走出迷宫,操作数加一,跳出while循环
if (x < 0 || x > 9 || y < 0 || y > 9) {
count++;
break;
}
//2、该玩家回到被访问过的房间,无法走出迷宫,同样跳出该循环
if (vis[x][y] == true) {
break;
}
//对访问过的房间标记
vis[x][y] = true;
//根据规则,对x,y进行操作
switch (array[x][y]) {
case 'U':
x -= 1;
break;
case 'D':
x += 1;
break;
case 'L':
y -= 1;
break;
case 'R':
y += 1;
break;
default:
break;
}
}
}
}
//打印输出走出迷宫的人数
System.out.println(count);
}
}