一、题目
牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
二、代码
package Lan2015;
public class seven牌型种类 {
/*
*
* 牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
* *//** 1.利用递归和回溯的思想*** *///1.定义私有静态整形变量,用来返回最终的组合数private static int sum;//2.main方法public static void main(String[] args) {//函数的入口,输出最后的组合数f(0,0);System.out.println("能拿到的初始牌型组合一共有" + sum + "种");}//3.写递归调用的函数,私有的,返回空,传入的参数是,牌的堆数 和 抽取到的牌的数量private static void f(int k, int ans){//如果堆的数量大于13 或抽取到的牌的数量大于13,则返回//如果堆的数量等于13且抽取到的牌的数量等于13,则sum++,并返回if(k > 13 || ans > 13) {return;}if(k == 13 && ans == 13) {sum++;return;}//遍历每一堆牌的所有可能情况for (int i = 0; i < 5; i++) {f(k + 1, ans + i);//i代表的是某种牌已经出现的次数,方便在下一次的递归调用中对已经调用的牌进行累加操作}}}
三、反思
1.执行结果:
能拿到的初始牌型组合一共有3598180种
2.总共有54-2张牌,一个人要抽取13张,简单来理解就是,你从13堆(第一堆都是A,第二堆都是2,第三堆都是3,..... 第13堆都是K),里面抽取13张牌,第一堆你可能抽取的数目是0或1或2或3或4张,题目中所设计的递归函数f传入的参数有堆数和拥有的牌数,
而你在for循环里面进行递归调用的时候,每次要更新堆数,和你的牌数(在这时,你的牌数可能在某一堆里有好几个,也可能某一堆里面没有一张)