• 走迷宫问题总结


    1、判断一个迷宫是否有出口

    这个题目是我自己编的,leetcode上并没有这样的题目。为了锻炼自己的DFS,这个题目应该还是比较简单的,用深搜就可以完成,和之前做的max area of island有异曲同工之妙。

    poll出迷宫问题:

    如图所示的迷宫,0代表可以走,1代表有墙。要求从左上角到右下角是否有一条路可以走完。如何判断这个迷宫内是否有路。代码如下:

     1 boolean res = false;
     2     int[] dest;
     3     int[][] grid;
     4     boolean[][] visited;
     5     public boolean can(int[][] grid, int[] start, int[] dest){
     6         boolean[][] visited = new boolean[grid.length][grid[0].length];
     7         this.dest = dest;
     8         this.grid = grid;
     9         this.visited = visited;
    10         helper(start[0],start[1]);
    11         return res;
    12     }
    13 
    14     private void helper(int i, int j) {
    15         if ( i == dest[0] && j == dest[1] ) res=true;
    16         visited[i][j] = true;
    17         if ( cango(i-1,j) ) helper(i-1,j);
    18         if ( cango(i+1,j) ) helper(i+1,j);
    19         if ( cango(i,j-1) ) helper(i,j-1);
    20         if ( cango(i,j+1) ) helper(i,j+1);
    21     }
    22 
    23     public boolean cango(int i, int j){
    24         if ( i < 0 || j < 0 || i >= grid.length || j >= grid.length) return false;
    25         if ( grid[i][j] == 1 || visited[i][j] ) return false;
    26         return true;
    27     }

          start数组时起始位置,end数组是终止位置。注意visited数组必不可少,记录走过的位置,已经走过的就不能再走了,否则就会陷入死循环。

          这里先用一个cango函数来判断下一步是否可走,其实可以进行合并,简化一下:

     1     boolean res = false;
     2     int[] dest;
     3     int[][] grid;
     4     boolean[][] visited;
     5     public boolean can(int[][] grid, int[] start, int[] dest){
     6         boolean[][] visited = new boolean[grid.length][grid[0].length];
     7         this.dest = dest;
     8         this.grid = grid;
     9         this.visited = visited;
    10         newhelper(start[0],start[1]);
    11         return res;
    12     }
    13 
    14     private void newhelper(int i, int j ){
    15         if ( i < 0 || j < 0 || i >= grid.length || j >= grid.length) return ;
    16         if ( grid[i][j] == 1 || visited[i][j] ) return ;
    17         if ( i == dest[0] && j == dest[1] ) res=true;
    18         visited[i][j] = true;
    19         newhelper(i-1,j);
    20         newhelper(i+1,j);
    21         newhelper(i,j-1);
    22         newhelper(i,j+1);
    23     }

          我自己测试了几组情况,是正确的。不知道其他的情况是不是正确。

    2、记录迷宫正确路径

    现在问题变成这样,首先判断迷宫中能否有正确的道路,如果有的话,找出最短的那个道路。

    因为要保存道路,所以一定要用一个数据结构来保存路径,栈是最好的。因为栈后进先出的特性,使得栈很适合数据的迭代。这里用两个栈来简单做一下,第一个栈stack1保存节点的行,第二个栈保存节点的列,两个栈就确定一个节点。

    因为找的是最短路径,所以可以使用BFS算法。

  • 相关阅读:
    javascript获取xml节点的最大值
    iis 不能浏览aspx页面
    批量替换文件夹里面的文本文件的指定字符
    select update delete
    SQL IAM的理解
    数据库的页构成
    sqltype IsDBNull
    MSSQL优化教程之1.4 其他几种类型的页面
    SqlDataAdapter
    行状态,行版本
  • 原文地址:https://www.cnblogs.com/boris1221/p/9368644.html
Copyright © 2020-2023  润新知