蓝桥杯省赛 牌型种数java

时间:2023-03-09 17:26:23
蓝桥杯省赛 牌型种数java

小明被劫持到X赌城,*与其他3人玩牌。

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

不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,那么牌的点数在暴力时可以有序。此时,所不确定的便只剩每点牌的张数了。则代码如下

 package com.k;

 import java.util.Scanner;

 public class Main
{
public static void main(String args[]) {
long 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++) {
int pre = a+b+c+d+e+f+g+h+i+j+k+l+m;
if(pre==13) {
sum++;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
System.out.println(sum);
}
}

答案为 3598180

再看一下深搜:

public class Main {
static int sum = 0;
static int res = 0;
public static void main(String[] args) {
dfs(1);
System.out.println(res);
} // 十三种牌型,循环十三次
public static void dfs(int num) {
if(sum>13) {
return;
}
if(num==14) {
if(sum == 13) {
res++;
}
return;
}
// 选择拿几次
for(int i = 0;i<5;i++) {
sum+=i;
dfs(num+1);
sum-=i;
}
}
}