1. 程式人生 > >藍橋杯 牌型種數 (暴力||dfs)

藍橋杯 牌型種數 (暴力||dfs)

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