[问题描述]
标题:迷宫
X星球的一处迷宫游乐场建在某个小山坡上。
它是由10x10相互连通的小房间组成的。
房间的地板上写着一个很大的字母。
我们假设玩家是面朝上坡的方向站立,则:
L表示走到左边的房间,
R表示走到右边的房间,
U表示走到上坡方向的房间,
D表示走到下坡方向的房间。
X星球的居民有点懒,不愿意费力思考。
他们更喜欢玩运气类的游戏。这个游戏也是如此!
开始的时候,直升机把100名玩家放入一个个小房间内。
玩家一定要按照地上的字母移动。
迷宫地图如下:
------------
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
------------
请你计算一下,最后,有多少玩家会走出迷宫?
而不是在里边兜圈子。
请提交该整数,表示走出迷宫的玩家数目,不要填写任何多余的内容。
[解答思路]
拿到这个题目,有两个思路:
1.首先能出迷宫的出口都在4条边上,所以判断4条边上的出口。然后再判断迷宫中的其他房间能否到达这些出口房间,以此类推。在实现上,需要用到广度优先算法,大体的思路是有一个10*10的布尔值的数组,先将四条边上的出口设置为true,然后压栈,在出栈的时候,进行计数和判断,判断这个房间上下左右的其他房间是否能够达到这些出口房间,如果能到达,设置为true,同时压栈,以此类推。
2.简单一点的算法实现,就是暴力破解,遍历每一个节点,对其进行操作判断。如果行列值有一个小于0,就表示出了迷宫。我设置的出不了迷宫的条件是,设置一个计数器,如果这个房间的判断次数大于100,就可以理解为他出不去了。为了减少时间复杂度,我偷懒设置的限制为30.
[我的答案1]
这是第二个思路的答案:
public class MyAnswer {
public static void main(String[] args) {
int count=0;
//输入迷宫,存储迷宫
char[][] maze=new char[10][10];
String temp;
Scanner sc=new Scanner(System.in);
for(int i=0;i<10;i++) {
temp=sc.nextLine();
maze[i]=temp.toCharArray();
}
//接下来三重循环,来找到出口
for(int i=0;i<10;i++) {
for(int j=0;j<10;j++) {
int i_temp=i;
int j_temp=j;
for(int k=0;k<30;k++) {
if(i_temp<0 || j_temp<0 ||i_temp>9 || j_temp>9) {
count++;
break;
}
char temp_char=maze[i_temp][j_temp];
if(temp_char=='U')
i_temp=i_temp-1;
else if(temp_char=='D')
i_temp=i_temp+1;
else if(temp_char=='R')
j_temp=j_temp+1;
else if(temp_char=='L')
j_temp=j_temp-1;
}
}
}
//输出结果
System.out.println(count);
}
}
[我的答案2]
用广度优先算法的答案,遇到了一些小问题,还没有调完,过段时间会进行更新。