藍橋杯 牌型種數 (暴力||dfs)
阿新 • • 發佈:2018-12-30
牌型種數
小明被劫持到X賭城,被迫與其他3人玩牌。
一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。
這時,小明腦子裡突然冒出一個問題:
如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?
思路:迴圈遍歷每個點數所選擇的張數,每個點數最多可以選4張,最少可以選0張即不選,每當牌總數達到13張則計數。
答案:3598180
暴力法:
#include <iostream> using namespace std; int main() { int sum=0; for(int a=0; a<=4; a++) for(int b=0; b<=4; b++) for(int c=0; c<=4; c++) for(int d=0; d<=4; d++) for(int e=0; e<=4; e++) for(int f=0; f<=4; f++) for(int g=0; g<=4; g++) for(int h=0; h<=4; h++) for(int i=0; i<=4; i++) for(int j=0; j<=4; j++) for(int k=0; k<=4; k++) for(int l=0; l<=4; l++) for(int m=0; m<=4; m++) { if(a+b+c+d+e+f+g+h+i+j+k+l+m==13) sum++; } cout<<sum<<endl; return 0; }
dfs:
dfs的深度是牌的型別,每種牌可以選0~4種,選的牌的總數相加==13.....
#include<bits/stdc++.h> using namespace std; int ans=0; void dfs(int type,int sum) { if(sum>13) return; if(type==13) { if(sum==13) ans++; return; } for(int i=0;i<5;i++) { dfs(type+1,sum+i); } } int main() { dfs(0,0); cout<<ans<<endl; }