迷宫回溯分析及简单实现

package com.cai.learn.math;

/**
 * 迷宫回溯:
 * 目标:用递归方法达到指定位置
 */
public class MazeQuestion {
    public static void main(String[] args) {
        //搭建简单的迷宫
        int[][] maze = new int[8][7];
        //搭建四周 以数字1 表示挡板
        //左右两竖排
        for (int i = 0; i < 8; i++) {
            maze[i][0] = 1;
            maze[i][6] = 1;
        }
        //上下两横排
        for (int i = 0; i < 7; i++) {
            maze[0][i] = 1;
            maze[7][i] = 1;
        }
        //中间设置2个挡格 maze[3][1] maze[3][2]
        maze[3][1] =1;
        maze[3][2] =1;

        /*基本形成:
        1    1    1    1    1    1    1
        1    0    0    0    0    0    1
        1    0    0    0    0    0    1
        1    1    1    0    0    0    1
        1    0    0    0    0    0    1
        1    0    0    0    0    0    1
        1    0    0    0    0    0    1
        1    1    1    1    1    1    1
         */
        //目标:从maze[1][1] --->maze[6][5]
        setWay(maze,1,1);
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j <7 ; j++) {
                System.out.print(maze[i][j]+"	");
            }
            System.out.println();
        }
        /*基本实现 2是所走的路线
        1    1    1    1    1    1    1
        1    2    0    0    0    0    1
        1    2    2    2    0    0    1
        1    1    1    2    0    0    1
        1    0    0    2    0    0    1
        1    0    0    2    0    0    1
        1    0    0    2    2    2    1
        1    1    1    1    1    1    1
         */
    }
    /**
     * 说明:
     * 1.maze表示地图
     * 2.i,j表示开始位置(1.1)
     * 3.如果能移动到位置(7.5),则说明找到
     * 4.约定:0.表示没有走过的路,1表示此路不通,2表示通路可以走,3.表示已经走过但此路不通
     * 5.在走迷宫时,需要一个策略(方法) 下->右->上->左,若果走不通,再回溯
     *
     * @param maze 模拟地图数组
     * @param i 横坐标
     * @param j 纵坐标
     * @return
     */
    public static boolean setWay(int[][] maze,int i,int j){
        if(maze[6][5]==2){
            return true;
        }else{
            if(maze[i][j]==0){//表示未走过
                //下->右->上->左
                maze[i][j] = 2;
                if(setWay(maze,i+1,j)){
                    return true;
                }else if(setWay(maze,i,j+1)){
                    return true;
                }else if(setWay(maze,i-1,j)){
                    return true;
                }else if(setWay(maze,i,j-1)){
                    return true;
                }else{
                    maze[i][j] = 3;
                    return false;
                }
            }else{
                return false;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/cai170221/p/13697157.html