蓝桥杯省赛 牌型种数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; } } }