藍橋杯-會思考的小明

題目

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

反思

一開始我是用dfs(int step)這裏step表示我發到第step張牌。每次發到一張牌有13種點數選擇,每種點數有1-4(0跳過)張的可能性。剪枝只能想到剪每種點數選擇大於4的剪去(continue)。o(13^13)
其實可以作爲二維dfs(int step, int sum)step代表當前考慮第step種花色,sum代表當前有sum張牌。step爲層數因爲13種都要考慮到,而sum只要最後判斷是否滿足要求即可。o(4^13)
這道題有 13種花色,1-4種拿牌數, 13張牌。分別用step, sum,vis[14]表示。在選擇深搜層數的具體含義時候,應當有所取捨,分清數值的含義是屬於約束條件還是情況。

代碼

#include<bits/stdc++.h>
using namespace std;
int cho[14], cnt;
void dfs(int step, int sum){
	if(step == 13){
		if(sum == 13) cnt++;
		return;
	}
	for(int i = 0; i<5; i++){
		if(cho[step]+i>4) continue;
		if(sum+i>13) continue;
		cho[step] += i;
		dfs(step+1, sum+i);
		cho[step] -= i;
	}
}
int main(){
	cnt = 0;
	memset(cho, 0, sizeof(cho));
	dfs(0, 0);
	printf("%d", cnt);
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章