【深度优先搜索】dfs深搜

    深度优先搜索,简称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;//该点解除标记
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值