题目大意:52张去除大小鬼的扑克牌,问抽到的牌型有多少种
解题思路:做的时候思路还不够清晰,要加油了,第九届蓝桥杯满打满算只剩39天了!本题可以暴力,要写13个循环,太冗长。于是改用爆搜,从这13个牌型每次搜索一个牌型拿的张数,递归出口是把13种牌型选完从52张牌抽出13张的话次数就+1,本来用一个数组标记拿过的牌的和,但是发现不对,有这样一种情况 例如:1 2 3 4 四种牌型各4张,从中选4张的种数,2+2+3+3=10,发现如果把10标记的话,下次搜到1+1+4+4=10,1+2+3+4=10,2+2+2+4=10等等这些都无法使次数+1,显然这个操作就画蛇添足。然后剪枝的话,当拿到的牌数sum>13的话就去掉。
答案:3598180
AC代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
int cnt;
void dfs(int x,int sum)
{
if(sum>13)
return ;
if(x>13)
{
if(sum==13)
cnt++;
return ;
}
for(int i=0;i<5;i++)
dfs(x+1,sum+i);
return ;
}
int main()
{
cnt=0;
dfs(1,0);
cout<<cnt<<endl;
return 0;
}