2015年第六届蓝桥杯JavaB组——第七题牌型种数
牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
答案:3598180
解题思路:第一下拿到这个题目,思路不是很明确,一开始还想通过数学的排列组合公式来求解该题,后面看了下网友的答案,觉得别人的思路挺有道理,这里的13张牌组合形式有很多种,去掉了大小王一副牌就只剩下52张,在这52张里共有13种牌,分别是数字1~13这13个数字(因为题目已经说了不考虑花色),这样的话也就是在这13种牌里面选13张牌,而每种牌的选择可能有0张~4张,这样思路一下子就清晰多了,最后自己也用别人的代码跑了一下,发现结果是对的。每次自己总是瞧不起暴力法,其实有的时候暴力法在求解这种组合方式个数的类似问题上还是很有用的。
暴力破解:
1 package com.lzp.lanqiaosix.p7; 2 3 /** 4 * @Author LZP 5 * @Date 2021/3/7 18:41 6 * @Version 1.0 7 * 8 * 暴力破解法 9 * 10 * 时间消耗: 11 * 3079ms 12 */ 13 public class Main { 14 15 public static void main(String[] args) { 16 // 牌型种类 17 //不考虑花色 每种牌被抽取有五种情况 都没有抽取到四张全部抽走 循环 直到牌总数等于13 18 int a[]= new int[13]; 19 int count=0; 20 long start = System.currentTimeMillis(); 21 for (a[0] = 0; a[0] <=4; a[0]++) { 22 for (a[1] = 0; a[1] <=4; a[1]++) { 23 for (a[2] = 0; a[2] <=4; a[2]++) { 24 for (a[3] = 0; a[3] <=4; a[3]++) { 25 for (a[4] = 0; a[4] <=4; a[4]++) { 26 for (a[5] = 0; a[5] <=4; a[5]++) { 27 for (a[6] = 0; a[6] <=4; a[6]++) { 28 for (a[7] = 0; a[7] <=4; a[7]++) { 29 for (a[8] = 0; a[8] <=4; a[8]++) { 30 for (a[9] = 0; a[9] <=4; a[9]++) { 31 for (a[10] = 0; a[10] <=4; a[10]++) { 32 for (a[11] = 0; a[11] <=4; a[11]++) { 33 for (a[12] = 0; a[12] <=4; a[12]++) { 34 if (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]+a[10]+a[11]+a[12]==13) { 35 count++; 36 } 37 } 38 } 39 } 40 } 41 } 42 } 43 } 44 } 45 } 46 } 47 } 48 } 49 } 50 long end = System.currentTimeMillis(); 51 System.out.println(count); 52 System.out.println(end - start + "ms"); 53 } 54 55 }
递归求解:
1 package com.lzp.lanqiaosix.p7; 2 3 /** 4 * @Author LZP 5 * @Date 2021/3/7 17:08 6 * @Version 1.0 7 * 8 * 9 * 递归求解: 10 * 效率比暴力破解低 11 * 12 * 时间消耗: 13 * 8173ms 14 */ 15 public class Main { 16 private static int count; 17 private static int[] arr = new int[13]; 18 19 public static void main(String[] args) { 20 // 牌的种类有13种,分别为数字1~13,这里可以通过递归来求解各个牌种类发到小明手上的情况 21 long start = System.currentTimeMillis(); 22 f(0); 23 long end = System.currentTimeMillis(); 24 System.out.println(count); 25 System.out.println(end - start + "ms"); 26 } 27 28 public static void f(int index) { 29 if (index == arr.length) { 30 // 判断此时小明手中是否已经有13张牌,如有则count+1 31 int total = 0; 32 for (int i = 0; i < arr.length; i++) { 33 total += arr[i]; 34 } 35 if (total == 13) { 36 count++; 37 } 38 return; 39 } 40 41 42 for (int i = 0; i <= 4; i++) { 43 // 发数字为index + 1的i张牌给小明 44 arr[index] = i; 45 f(index + 1); 46 } 47 } 48 }