【数据结构与算法】5.1 谜宫回溯问题

package com.hblg.guigu.recursion;

/**
 * @author i
 * @create 2019/9/28 15:09
 * @Description 迷宫回溯
 *
 *  思路:对于这列问题 我们可以使用递归的方法来解决。
 *  使用二维数组模拟谜宫。1表示为墙 2表示可以走 3代表死路 0 代表为空
 *
 */
public class MiGong {

    public static void main(String[] args) {
        int [][] array = new int [8][7];
        //初始化上边和下边的墙
        for (int i = 0; i < 7; i++) {
            array[0][i] = 1;
            array[7][i] = 1;
        }
        
        //初始化左边和右边的墙
        for (int i = 0; i < 8; i++) {
            array [i][0] = 1;
            array [i][6] = 1;
        }

        //遍历数组
        System.out.println("初始化谜宫");
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++) {
                System.out.print(array[i][j]+"\t");
            }
            System.out.println();
        }
        //设置障碍墙
        array [3][1] = 1;
        array [3][2] = 1;

        setWay2(array,1,1);
        System.out.println("走完之后");
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++) {
                System.out.print(array[i][j]+"\t");
            }
            System.out.println();
        }

    }

    /***
     *上右下左
     * @param array 数组
     * @param i 行
     * @param j 列
     * @return
     */
    public static boolean setWay(int [][] array,int i,int j) {
        if (array[6][5] == 2) {//说明找到
            return true;
        } else {//按照上右下左走
            if (array[i][j] == 0) {
                array[i][j] = 2;
                if (setWay(array, i - 1, j)) {//上
                    return true;
                } else if (setWay(array, i, j + 1)) {//右
                    return true;
                } else if (setWay(array, i + 1, j)) {//下
                    return true;
                } else if (setWay(array, i, j - 1)) {//左
                    return true;
                } else {
                    array[i][j] = 3;//死路
                    return false;
                }
            } else {
                return false;//1 表示墙 2表
            }
        }
    }

    /***
     *下右上左
     * @param array 数组
     * @param i 行
     * @param j 列
     * @return
     */
    public static boolean setWay2(int [][] array,int i,int j) {
        if (array[6][5] == 2) {//说明找到
            return true;
        } else {//按照上右下左走
            if (array[i][j] == 0) {
                array[i][j] = 2;
                if (setWay2(array, i + 1, j)) {//下
                    return true;
                } else if (setWay2(array, i, j+1)) {//右
                    return true;
                } else if (setWay2(array, i - 1, j)) {//上
                    return true;
                } else if (setWay2(array, i, j -1)) {//左
                    return true;
                } else {
                    array[i][j] = 3;//死路
                    return false;
                }
            } else {
                return false;//1 表示墙 2表
            }
        }
    }


}

 

全部评论

相关推荐

面了100年面试不知...:被割穿了才想起来捞人了
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
程序员牛肉:继续沉淀吧同学,你这就是纯纯的流水线产品。 差不多的学历+两个烂大街项目。自身学历又不行,现在找啥实习呢。有点太浮躁了。多花点心思搞搞ai,开源和八股。这比你这段时间捣鼓一段小厂实习要好得多;
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务