蓝桥杯省赛 牌型种数java

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

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

 

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

 1 package com.k;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main
 6 {
 7     public static void main(String args[]) {
 8         long sum = 0;
 9         for(int a=0;a<=4;a++) {
10             for(int b=0;b<=4;b++) {
11                 for(int c=0;c<=4;c++) {
12                     for(int d=0;d<=4;d++) {
13                         for(int e=0;e<=4;e++) {
14                             for(int f=0;f<=4;f++) {
15                                 for(int g=0;g<=4;g++) {
16                                     for(int h=0;h<=4;h++) {
17                                         for(int i=0;i<=4;i++) {
18                                             for(int j=0;j<=4;j++) {
19                                                 for(int k=0;k<=4;k++) {
20                                                     for(int l=0;l<=4;l++) {
21                                                         for(int m=0;m<=4;m++) {
22                                                             int pre = a+b+c+d+e+f+g+h+i+j+k+l+m;
23                                                             if(pre==13) {
24                                                                 sum++;
25                                                             }
26                                                         }
27                                                     }
28                                                 }
29                                             }
30                                         }
31                                     }
32                                 }
33                             }
34                         }
35                     }
36                 }
37             }
38         }
39         System.out.println(sum);
40     }
41 }

答案为 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;
        }
    }
}

 

posted @ 2018-11-18 10:24  k_kK  阅读(300)  评论(0编辑  收藏  举报