【算法】蓝桥杯dfs深度优先搜索之排列组合总结

前言

  上一篇文章 → 《【算法】蓝桥杯dfs深度优先搜索之凑算式总结》

  为了重申感谢之意,再次声明下文的大部分灵感均来自于【CSDN】梅森上校《JAVA版本:DFS算法题解两个例子(走迷宫和求排列组合数)》
  强烈推荐大家去上面那篇文章看看,写的很好。
  下面我会列出蓝桥杯第六届B组省赛第7题、第七届第5题、第八届第4题,共3道题。

  因为他们都是:排列组合。

正文

【第一道题】

牌型种数
  这道题可以强制转为昨天的“凑算式”类型。
  首先,强调一下题意,总共13种牌A到K,每种可以选0到4张,总共选出13张,两个13如果简单表示的话就是2 13,其中13也可以用大写的字母B表示,隐晦的透露了这道题的内涵。
  如果你还能想起来昨天“凑算式”的思路的话,那么上来第一件事肯定就是设置一个数组了
  下图是我昨天在最后一题做的总结,对于这道题来说,也适合。
步骤
  第一件事,显然这个数组的长度为13,因为我们要存13种牌,数组中只存0到4之间的数。

public static int[] a = new int[13];

  第二件事,这里不涉及到数字重用与否,略过。
  第三件事,定义dfs方法,还是和昨天一样,就传一个index参数

public static void dfs(int index)

  第四件事,写递归结束条件,这里就是index == 13,越界,代表A到K我们已经取完了,接下来就是要统计一下总数是不是13张。如果是的话,就算一种,count++。

// 递归结束条件
if(index == 13) {
   
	int sum = 0;
	for(int i : a) {
   
		sum += i;
	}
	if(sum == 13) {
   
		count++;
	}
	return; //递归结束一定要有return啊,没有return不叫递归结束
}

  第五件事,还未凑齐,深搜。a[]数组总共13个位置,每个位置是0到4中的一个数。代码如下:

// 搜索
for(int i=0; i<=4; i++) {
   
	a[index] = i;
	dfs(index+1); 
}

【完整代码】

public class 牌型种数dfs {
   
	public static int count = 0 ;
	public static int[] a = new int[13];
	public static void dfs(int index) {
   
		if(index == 13) {
   
			int sum = 0;
			for(int i : a) {
   
				sum += i;
			}
			if(sum == 13) {
   
				count++;
			}
			return;
		}
		// 搜索
		for(int i=0; i<=4; i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值