天天看點

曆屆試題—牌型種數

小明被劫持到X賭城,被迫與其他3人玩牌。一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。這時,小明腦子裡突然冒出一個問題:如果不考慮花色,隻考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?

請填寫該整數,不要填寫任何多餘的内容或說明文字。

解法一:枚舉

#include <iostream>
using namespace std;
int a[14],sum=0;
int main()
{
 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]++)
 for(a[13]=0;a[13]<=4;a[13]++){
  if(a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]+a[10]+a[11]+a[12]+a[13] == 13){
   sum++;
  }
 }
 cout<<sum<<endl;
    return 0;
}
           

解法二:dfs

#include <iostream>
using namespace std;
int sum=0;
//目前是第i種牌,小明手裡有j張
void dfs(int i,int j){
 if(i>13) return;
 if(j>13) return;
 if(j==13) {
  sum++;
  return;
 }
 dfs(i+1,j);
 dfs(i+1,j+1);
 dfs(i+1,j+2);
 dfs(i+1,j+3);
 dfs(i+1,j+4); 
}
int main()
{
 dfs(0,0);
 cout<< sum <<endl;
    return 0;
}
           

繼續閱讀