DFS算法题解两个例子(走迷宫和求排列组合数)
用DFS算法来求解几道题目。典型的问题是走迷宫问题。
####走迷宫题目描述
给定一个M*N的矩阵(二维数组),分别用0和1表示通路和障碍物。即 0 表示 通路;1 表示 障碍物。从矩阵的左上角开始,每次只能向右,下,左,上移动位置,不能斜着走。请给出从入口到出口的路线。
怎么开始思考呢?
首先想想,这个题目其实是找从入口(Entrance)到出口(Exit)的可能的路径。矩阵(二维数组)从左上角开始,坐标为(0,0),可以向右走,坐标为(0,1);或者向下走,坐标为(1,0)。对于一般的位置(x,y),可以有4个搜索方向:右(x,y+1),下(x+1,y),左(x,y-1),上(x-1,y)。
如何设计DFS搜索函数呢?
二维数组(M行,N列)的右下角出口位置可以表示为:(m-1, n-1)
路径表示为path ; 但是路径可能有很多条,其中最短的路径表示为:shortestPath。
至少这个函数需要三个参数。dfs(x坐标,y坐标,搜索矩阵即二维数组)
所定义dfs函数为:
public static void dfsMaze(int x,int y, int[][] maze)
然后设计搜索结束返回的判断条件
//设置结束条件
if (x < 0 || y < 0)
return;
// 如果坐标越界,或者 maze[x][y]==1 表示遇到障碍
if (x > m - 1 || y > n - 1 || maze[x][y] ==1)
return;
//表示遇到障碍
if (maze[x][y] == 1)
return; // 判断是否通路和越界
判断是否达到出口位置