深度优先搜索思想入门!

搜索算法的一个经典算法,深度优先搜索!

在这里我将用一个简单的例子,来入门深度优先搜索的思想!核心代码不超过20行。

深度优先搜索的基本模型,理解深度优先搜索的关键在于解决“当下该如何做”。

至于“下一步如何做”则与“当下该如何做”是一样的。比如我们这里写的dfs(step)函数

的主要功能就是解决当你在step步的时候你该怎么办!通常的方法就是把每一种可能都去

尝试一遍。当这一步解决后就进入下一步dfs(step+1)。下一步的解决方法和当前这一步

的解决方法是完全一样的。下面的代码就是深度优先搜索的基本模型:

public static void dfs(int step)
    {	
    	判断边界
    	尝试每一种可能 for(i=1;i<= n;i++)
    	{	
    		继续下一步 dfs(step+1);
    	}
    	返回
    }


下面举一个深度优先搜索实现的全排列!


import java.util.Scanner;

public class quanpailie_sousuo {
	static int[] book;// 计数器
	static int[] a;// 盒子
	static int n;

	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		 a = new int[10];
		 book = new int[10];
		n = sc.nextInt();
		dfs(1);
	}

	private static void dfs(int step) {
		// TODO Auto-generated method stub
		if (step == n + 1) {
			for (int i = 1; i <= n; i++) {
				System.out.print(a[i]);
			}
			System.out.println();
			return;// 返回之前的一步,最近一次调用dfs函数的地方
		}
		for (int i = 1; i <= n; i++) {
			if (book[i] == 0) {// book[i]=0表示i号扑克牌仍然在手上
				a[step] = i;// 将i号扑克牌放入第step个盒子中
				book[i] = 1;// 将book[i]设为1 , 表示 i 号 扑克牌 已经不在手上了
				
				dfs(step + 1);// 递归调用
				book[i] = 0;// 这是非常重要的一步,一定要将刚才尝试的扑克收回,才能进行下一次尝试
			}
		}
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值