迷宫问题

[问题描述]

标题:迷宫

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]

用广度优先算法的答案,遇到了一些小问题,还没有调完,过段时间会进行更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值