深度优先搜索,简称dfs,是一个经典的搜索算法。我们通常用栈来实现搜索,这跟递归非常的相似(其实可以说深搜就是用递归实现的),这里先讲一下什么是递归。
什么情况下用递归呢?当我们解决n的问题解决不了的时候我们往往去解决n-1的问题,然后根据n-1的结果去得到n的结果。
阶乘问题
public void dfs(int n){//n=5输入
if(n==1)return n;//5的阶乘
return n*dfs(n-1)
}
其实这个问题的解决方法就是深度优先搜索, 也就是一条路走到黑,走到底后进行回溯。dfs通常用来解决迷宫问题,比如记录起点到终点的方案数。
迷宫问题
思路 :
从起点开始,往四个方向尝试,走过的地方就要标记已经走过,然后继续往下走一直走到边界或目的地后返回并更新结果,返回后要将原标记去除,尝试完所有可能后从出口退出
public class dfs迷宫 {
static int n ;//n行
static int m ;//m列
static int t ;//障碍总数
static int SX ;//入口x坐标
static int SY ;//入口y坐标
static int FX ;//出口x坐标
static int FY ; //出口y坐标
//static int map[][] = new int[m+1][n+1];
static int ans;//记录答案
static boolean[][] visited;//判断该点是否访问
static int[] dx = {-1,0,0,1};//x的增量,左上下右
static int[] dy = {0,-1,1,0};//y的增量
public static void main(String[] args) {
Scanner sr = new Scanner(System.in);
n = sr.nextInt();
m = sr.nextInt();
t = sr.nextInt();
SX = sr.nextInt();
SY = sr.nextInt();
FX = sr.nextInt();
FY = sr.nextInt();
visited = new boolean[n+1][m+1];
// for(int i=1;i<=n;++i) {//输入地图
// for(int j=1;j<=m;++j) {
// map[i][j] = sr.nextInt();
// }
// }
for(int i=0;i<t;++i) {
int a = sr.nextInt();
int b = sr.nextInt();
visited[a][b] = true;//标记已经走过
}
visited[SX][SY] = true;//标记起点
dfs(SX,SY);//深搜
System.out.print(ans);
}
private static void dfs(int x,int y) {
// TODO Auto-generated method stub
if(x==FX&&y==FY) {ans++;return;}//如果走到终点ans++
for(int i=0;i<4;++i) {//遍历四个方位
int xx = x+dx[i];
int yy = y+dy[i];
if(xx>=1&&yy>=1&&xx<=m&&yy<=n&&!visited[xx][yy]) {//判断是否超边界,判断是否已经走过,并且不能是墙壁
visited[xx][yy] = true;//记录该点已经走过
dfs(xx,yy);//继续往下搜
visited[xx][yy] = false;//该点解除标记
}
}
}
}