牌型总数(蓝桥杯)

题目:

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

请填写该整数,不要填写任何多余的内容或说明文字。

解法一:暴力解法

直接利用暴力破解,牌总的有13种,每种可能取到的值有0~4,所以总的13层循环,每层循环一种牌(即四种花色),在最内层循环中计算手里牌数(即13层的循环数相加),如果和为13,牌型总数加一。

#include
int main() {
	int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13;//十三层循环,代表牌1~13
	i1 = i2 = i3 = i4 = i5 = i6 = i7 = i8 = i9 = i10 = i11 = i12 = i13 = 0;//初始没个牌的次数为一
	int count = 0;//组合数
	int sum = 0;//手中牌数
	for (i1 = 0; i1 <= 4; i1++)
		for (i2 = 0; i2 <= 4; i2++)
			for (i3 = 0; i3 <= 4; i3++)
				for (i4 = 0; i4 <= 4; i4++)
						for (i5 = 0; i5 <= 4; i5++)
							for (i6 = 0; i6 <= 4; i6++)
								for (i7 = 0; i7 <= 4; i7++)
									for (i8 = 0; i8 <= 4; i8++)
										for (i9 = 0; i9 <= 4; i9++)
											for (i10 = 0; i10 <= 4; i10++)
												for (i11 = 0; i11 <= 4; i11++)
													for (i12 = 0; i12 <= 4; i12++)
														for (i13 = 0; i13 <= 4; i13++) {
															sum = i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10 + i11 + i12 + i13;
															if (sum == 13) count++;
														}
	printf("%d", count);
	return 0;
}

解法二:dfs

思路:dfs方法是暴力破解的缩减版,主要思路是将循环改为递归

本次代码有借鉴网上相关代码


#include
int count = 0;//组合总数

void dfs(int type, int sum)
{
	if (sum > 13) return;
	if (type == 13) {//type即为牌的点数,每次深入下一层时几位牌的点数+1
		if (sum == 13) count++;//sum为手中牌的数量,当牌数为13时,count+1
		return;
	}
	for (int i = 0; i < 5; i++) {
		dfs(type + 1, sum + i);
	}
}

int main()
{
	dfs(0, 0);
	printf("%d", count);
    return 0;
}

你可能感兴趣的:(牌型总数(蓝桥杯))