前言
上一篇文章 → 《【算法】蓝桥杯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