迷宫问题——栈实现

什么是迷宫问题?

下面就是一个迷宫吧,这里我也不多做解释了。

给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口。

 

2.如何理解迷宫问题?

我们这里主要讨论一个解题思想,所以就使用指定入口和出口且只有一条通路的迷宫!

1.可以使用广度优先搜索探索迷宫(bfs)

2.可以通过深度优先搜索探索迷宫(dfs)

我们这里采用dfs探索迷宫,用栈来存储保存中间结果。

 

3.如何实现呢?

1.选定起点。

2.从起点向下探索,如果被探索到的点可走,则将该点加入栈,并以栈顶节点为起点继续探索。

3.栈空--->无通路 / 迷宫出口被访问到。

 

4.编程实现

	
        //迷宫地图
        private int[][] map={
			{ 0, 0, 0, 0, 1, 0 }, 
			{ 0, 1, 1, 0, 0, 1 }, 
			{ 1, 0, 1, 1, 0, 0 },
			{ 1, 0, 1, 0, 0, 0 },
			{ 0, 0, 1, 0, 1, 1 }, 
			{ 0, 0, 1, 0, 0, 0 }
	};
	
	//创建栈
	private Stack<Node> stack=new Stack<>();
	//给出起始点
	private Node start=new Node(0,0);
/**
	 * 环游迷宫寻找出路
	 */
	public void travel() {
		while(!stack.isEmpty()) {
			//弹出栈顶元素
			Node temp=stack.pop();
			//获取当前点的坐标
			int x=temp.getX();
			int y=temp.getY();
			
			//5,5为出口
			if(x==5 && y==5) {
				System.out.println("迷宫出出口已经找到!");
				
				for(int i=0;i<map.length;i++) {
					for(int j=0;j<map[1].length;j++) {
						System.out.print(map[i][j]+" ");
					}
					System.out.println();
				}
			}
			
			//向前探索
			if(x+1<6 && map[x+1][y]!=1 && map[x+1][y]!=2) {
				stack.push(new Node(x+1,y));
				map[x][y]=2;
				travel();
				map[x][y]=0;
			}
			//向后探索
			if(x-1>-1 && map[x-1][y]!=1 && map[x-1][y]!=2) {
				stack.push(new Node(x-1,y));
				map[x][y]=2;
				travel();
				map[x][y]=0;
			}
			//向上探索
			if(y+1<6 && map[x][y+1]!=1 && map[x][y+1]!=2) {
				stack.push(new Node(x,y+1));
				map[x][y]=2;
				travel();
				map[x][y]=0;
			}
			
			//向下探索
			if(y-1>-1 && map[x][y-1]!=1 && map[x][y-1]!=2) {
				stack.push(new Node(x,y-1));
				map[x][y]=2;
				travel();
				map[x][y]=0;
			}
		}
	}
	@Test
	public void fun1() {
		
		//起始点入栈
		stack.push(start);
		travel();
	}

写的比较简单明了,适合基础较薄弱的同学阅读!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值