第六屆 藍橋杯 c/c++ B組 省賽 (7)——牌型種數
阿新 • • 發佈:2019-01-29
牌型種數
小明被劫持到X賭城,被迫與其他3人玩牌。
一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。
這時,小明腦子裡突然冒出一個問題:
如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?
小明被劫持到X賭城,被迫與其他3人玩牌。
一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。
這時,小明腦子裡突然冒出一個問題:
如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?
請填寫該整數,不要填寫任何多餘的內容或說明文字。
這道題因為是填空題所以可以暴力,也可以dfs搜尋
最終答案是 3598180
解法一 暴力
#include<string.h> #include<stdio.h> #include<iostream> #include<math.h> using namespace std; int main() { int a[13],ans; ans=0; for(a[0]=0;a[0]<=4;a[0]++) { for(a[1]=0;a[1]<=4;a[1]++) { for(a[2]=0;a[2]<=4;a[2]++) { for(a[3]=0;a[3]<=4;a[3]++) { for(a[4]=0;a[4]<=4;a[4]++) { for(a[5]=0;a[5]<=4;a[5]++) { for(a[6]=0;a[6]<=4;a[6]++) { for(a[7]=0;a[7]<=4;a[7]++) { for(a[8]=0;a[8]<=4;a[8]++) { for(a[9]=0;a[9]<=4;a[9]++) { for(a[10]=0;a[10]<=4;a[10]++) { for(a[11]=0;a[11]<=4;a[11]++) { for(a[12]=0;a[12]<=4;a[12]++) { if(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]+a[10]+a[11]+a[12]==13) { ans++; } } } } } } } } } } } } } } printf("%d\n",ans); return 0; }
解法二 dfs
#include<iostream> using namespace std; int sum,ans; void dfs(int n)//n代表第n種牌,sum代表已經選擇欄sum張牌 ans代表選好的13張牌的種數 { if(sum>13)return ;//遞迴邊界,直接返回 if(n==14) { if(sum==13)ans++; }else{ for(int i=0;i<5;i++) { sum+=i; dfs(n+1); sum-=i;//因為每一輪i取不同的值 進行下一輪dfs時,sum的初始值應該相同,所以-i } } } int main() { sum=0;ans=0; dfs(1); cout<<ans<<endl; return 0; }