字节雀牌问题(Java)
2021/10/16 17:39:28
本文主要是介绍字节雀牌问题(Java),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 小包最近迷上了一款叫做雀魂的麻将游戏,但是这个游戏规则太复杂,小包玩了几个月了还是输多赢少。
- 于是生气的小包根据游戏简化了一下规则发明了一种新的麻将,只留下一种花色,并且去除了一些特殊和牌方式(例如七对子等),具体的规则如下:
- 总共有36张牌,每张牌是1~9。每个数字4张牌。
- 你手里有其中的14张牌,如果这14张牌满足如下条件,即算作和牌
- 14张牌中有2张相同数字的牌,称为雀头。
- 除去上述2张牌,剩下12张牌可以组成4个顺子或刻子。顺子的意思是递增的连续3个数字牌(例如234,567等),刻子的意思是相同数字的3个数字牌(例如111,777)
public class Canhu { public static void main(String[] args) { //输入数据 Scanner scan = new Scanner(System.in); HashMap<Integer,Integer> hashMap = new HashMap<>(); ArrayList<Integer> result = new ArrayList<>(); //初始化 for (int i = 1; i <= 9; i++) { hashMap.put(i,0); } //录入13张牌 int temp; for (int i = 0; i < 13; i++) { temp = scan.nextInt(); hashMap.put(temp,hashMap.get(temp)+1); } for (int i = 1; i <= 9; i++) { //从新添加一个数据,满足14张牌 if(hashMap.get(i) < 4){//当牌数等于4的时候,牌数已达上限,不能添加该牌 hashMap.put(i,hashMap.get(i)+1); if (isHuPai(hashMap,14,false)){//能胡牌 result.add(i);//将满足条件的牌保存 } hashMap.put(i, hashMap.get(i)-1);//将刚才添加的牌移除,继续循环,判断其他牌是否满足 } } //输出结果 if (result.size() == 0) System.out.println(0); for (Integer in : result){ System.out.print(in + " "); } } public static boolean isHuPai(HashMap<Integer,Integer> mainMap,int count,boolean haveQue) { HashMap<Integer,Integer> map = new HashMap<>();//每次创建一个新的哈希表,否则更改了原数据,存在两个以上的结果时不能正确输出 map.putAll(mainMap);//复制内容 if (count == 0)//牌数清零,返回true return true; if (haveQue){//有雀头,不断尝试去掉一对刻子或者一组顺子 for (int i = 1;i <= 9;i++){ //尝试刻子 if (map.get(i) >= 3){//大于3,有可能是刻子组合 map.put(i, map.get(i)-3);//-3,当做刻子组合 if(isHuPai(map,count-3,true)) return true; map.put(i, map.get(i)+3);//未能返回,表示不对,恢复原数量 } //尝试顺子 if (i <= 7 && map.get(i) > 0 && map.get(i+1) > 0 && map.get(i+2) > 0){//连续存在,可能存在顺子 map.put(i, map.get(i)-1);//各个值减1 map.put(i+1, map.get(i+1)-1); map.put(i+2, map.get(i+2)-1); if (isHuPai(map,count-3,true)){//判断是否满足 return true; } map.put(i, map.get(i)+1);//表示上边if未执行,恢复原数据 map.put(i+1, map.get(i+1)+1); map.put(i+2, map.get(i+2)+1); } } return false;//遍历完成,都没有返回,表示不能胡牌,返回false }else{//没有雀头,选择雀头 for (int i = 1; i <= 9; i++) { if (map.get(i) >=2){ map.put(i, map.get(i)-2); if (isHuPai(map,count-2,true)) return true; map.put(i, map.get(i)+2); } } return false;//遍历完成,都没有返回,表示不能胡牌,返回false } } }
这篇关于字节雀牌问题(Java)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南