1. 程式人生 > >第六屆 藍橋杯 c/c++ B組 省賽 (7)——牌型種數

第六屆 藍橋杯 c/c++ B組 省賽 (7)——牌型種數

牌型種數


小明被劫持到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;
}