zoukankan      html  css  js  c++  java
  • 程序设计与数据结构有关递归的学习:迷宫项目

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

    学习《程序设计与数据结构》中的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 = "
    ";
            for (int row = 0; row < grid.length; row++) {
                for (int column = 0; column < grid[row].length; column++) {
                    result += grid[row][column] + "";
    
                }
                result += "
    ";
            }
            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);
        }
    }
    
    

    效果:

    问题:但当时对递归并不熟悉,因此根本不能理解它以走迷宫的逻辑来走,为什么碰到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后死掉,从而可以得到一条通路。

  • 相关阅读:
    Redis从入门到精通:初级篇(转)
    Spring配置中的"classpath:"与"classpath*:"的区别研究(转)
    maven常用命令
    JUC-线程池调度-ScheduledThreadPool
    JUC-线程池
    JUC-线程八锁
    JUC-ReadWriteLock
    JUC-Condition和Lock实践-线程按序交替执行
    Linux 查看.so中导出函数
    nginx配置反向代理
  • 原文地址:https://www.cnblogs.com/VersionP1/p/7498287.html
Copyright © 2011-2022 走看看