程序设计与数据结构有关递归的学习:迷宫项目

本文介绍了一种使用递归解决迷宫问题的方法。通过Java实现了一个名为Maze的类,该类能够在一个预定义的迷宫中寻找路径。递归函数traverse()尝试在四个方向上进行搜索,当遇到不可通行的单元格(值为0)时返回,并标记已找到的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序设计与数据结构有关递归的学习:迷宫项目

学习《程序设计与数据结构》中的11章递归,其中有段关于迷宫设计的代码。它通过设计一个二元数组,并在其中随机分布0和1,1为通路,0则不能通过。当程序开始运行的时候,它会首先把试探的路以1变3的方式来体验,当最后得到出去的路的时候,它会将3变成7来显示。

Maze.java

package ch11;

/**
 * Created by Funny_One on 2017/9/6.
 */
public class Maze {
    private final int TRIED = 3;
    private final int PATH = 7;
    private int[][] grid = {
            {1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1},
            {1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1},
            {0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0},
            {1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0},
            {1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1},
            {1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1},
            {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};

    public boolean traverse(int row, int column) {
        boolean done = false;
        if (valid(row, column)) {
            grid[row][column] = TRIED;
            if (row == grid.length - 1 && column == grid[0].length - 1) {
                done = true;
            } else {
                done = traverse(row + 1, column);//往下走
                if (!done) {
                    done = traverse(row, column + 1);//往右走
                }
                if (!done) {
                    done = traverse(row - 1, column);//往上走
                }
                if (!done) {
                    done = traverse(row, column - 1);//往左走
                }
            }
            if (done) {
                grid[row][column] = PATH;
            }

        }
        return done;
    }

    private boolean valid(int row, int column) {
        boolean result = false;

        if (row >= 0 && row < grid.length && column >= 0 && column < grid[row].length ) {
            if (grid[row][column] == 1) {
                result = true;
            }
        }
        return result;
    }

    public String toString() {
        String result = "\n";
        for (int row = 0; row < grid.length; row++) {
            for (int column = 0; column < grid[row].length; column++) {
                result += grid[row][column] + "";

            }
            result += "\n";
        }
        return result;
    }
}

MazeSearch.java

package ch11;

/**
 * Created by Funny_One on 2017/9/7.
 */
public class MazeSearch {
    public static void main (String[] args){
        Maze labyrinth = new Maze();

        System.out.println(labyrinth);

        if(labyrinth.traverse(0,0)){
            System.out.println("The maze was successful traversed!");
        }else {
            System.out.println("There is no possible path.");
        }

        System.out.println(labyrinth);
    }
}

效果:

1062692-20170909151328616-1259373602.jpg

问题:但当时对递归并不熟悉,因此根本不能理解它以走迷宫的逻辑来走,为什么碰到0之后才会转换为另一个走向。最后经过一步步调试,仔细研究之后,我得到这么一个解释:

当程序从(0,0)向下走的时候,走到(1,0),然后再次执行这个方法,填入的参数则是(1,0)。(1,0)的值是1,所以就会执行参数为(1,0)的方法中的走法。首先向下走,走到(2,0),值为0,于是便无法触发参数为(2,0)的tranverse方法,于是退回到参数为(1,0)的tranverse方法。然后轮到向右走,走到(1,1),值为0,于是无法触发参数为(1,1)的tranverse方法,于是又退回参数(1,0)的tranverse方法。然后轮到向上走,走到(0,0),值为3,无法触发参数为(0,0)的tranverse的方法,于是又退回参数为(1,0)的tranverse方法。然后轮到向左走,走到(1,-1),因为越界异常,所以无法触发参数为(1,-1)的tranverse方法,于是又退回参数为(1,0)的tranverse方法。然后没有接下来的方法了,于是参数为(1,0)的tranverse方法就执行完成了,于是退回并继续执行参数(0,0)的tranverse的参数方法,然后执行到参数为(0,0)的tranverse方法中的向右走,然后重复以上步骤。走到最后的时候done变为true,一个个递归将对应位置的3转化为7后死掉,从而可以得到一条通路。

转载于:https://www.cnblogs.com/VersionP1/p/7498287.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值