什么是迷宫问题?
下面就是一个迷宫吧,这里我也不多做解释了。
给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口。
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();
}
写的比较简单明了,适合基础较薄弱的同学阅读!