题目来源:
[蓝桥杯2015初赛]牌型种数
http://oj.ecustacm.cn/problem.php?id=1253
AC代码: 思路都在注释里
#include<iostream>
using namespace std;
int ans=0;
void dfs(int k,int n){ //k为当前将要拿哪张牌(注意是将要拿,而不是已经拿了),k取1-13
// n为当前手里有多少张牌,n取1-13
if(k==14&&n==13) {
ans++;
return;
}
if(n>13) return ; // 当前牌数已经大于13了(拿多了) 该情况不合法,直接pass
if(k>13) return ; // 当前将要拿到的牌大于13(因为最多有2到A,13种牌) 直接pass
for(int i=0;i<=4;i++) // 将选择0~4张牌的情况全部考虑进去
dfs(k+1,n+i);
}
int main(){
dfs(1,0); //从牌种类为1,牌数为0开始深搜
cout<<ans;
}
蓝桥杯题目DFS的套路/模板:
void dfs(若干个参数){
if(当前情况正好是答案的一种) {
ans++;
return;
}
if(当前情况已经不满足题目要求了) return ;
从当前情况开始深度优先搜索
}
另外附上一份回溯算法:
https://blog.csdn.net/liuxingbusi/article/details/53556564