问题描述:
给定一个n*n的迷宫矩阵,障碍物记为1,无障碍记为0
int[][] map = new int[][]{
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};
要求:
- 使用栈实现
- 非递归算法实现
- 递归算法实现
思路:
1.非递归思路:
- 将起点入栈
- 进入循环 (主循环),循环条件是 栈不空 或者栈顶元素坐标为终点坐标
- 循环中依次 对栈顶元素的 右,下,左,上(内循环)四个方向判断是否为0,一旦出现一个为0,压入该节点,该节点标记为2(已访问); 内部循环进行的条件是,不为0的次数<4,如果等于4,说明栈顶元素的四个方向都是堵住的,弹出栈顶元素,结束内层循环
- 主循环结束后,通过判断栈是否为空,可以判断是否寻找到通路
java 代码实现:
import java.util.Stack;
/**
* @author wangwei
* @date 2019/1/27 20:42
* @classDescription 迷宫寻找出口路径:
* 1,使用栈记录正确路径,同时也是方便回退
*/
class mapNode {
int x;
int y;
public mapNode(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public String toString() {
return "mapNode{" +
"x=" + x +
", y=" + y +
'}';
}
}
public class MazeStack {
//使用 10*10 的矩阵 12*12 最外层是墙
// 1 表示墙
// 0 表示可走
static final int N_WIDTH = 12;
static final int N_HEIGHT = 12;
int[][] map = new int[][]{
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{
1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{
1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
{
1, 1,