张昌蒲 严教 卡牌计算器()

  本篇文章为你整理了张昌蒲 严教 卡牌计算器()的详细内容,包含有 张昌蒲 严教 卡牌计算器,希望能帮助你了解 张昌蒲 严教 卡牌计算器。

  1.描述

   玩过三国杀的朋友应该都知道有个将叫张昌蒲,他会随机给出N张卡牌,卡牌的点数在1-13之间,可能重复。现在要求把卡牌分为两堆,两边卡牌的点数之和必须相等,要求两堆的卡牌数之和尽量多。

   针对这个逻辑,我自己写了一些JAVA的实现,经过测试可行,下面给出代码,有兴趣的朋友可以看看,有改进的地方欢迎指出!

  2.代码如下

  计算分配方式的代码:

  

 1 public class CalculateCard {

 

   3 public static void main(String[] args) {

   4 Scanner scanner = new Scanner(System.in);

   5 System.out.println("请输入严教牌,按点数,以空格割开,如(13 11 10):");

   6 String input = scanner.nextLine();

   7 System.out.println(input);

   8 String[] inputCards = input.split(" ");

   9 List Integer list = new ArrayList ();

   10 try {

   11 Arrays.stream(inputCards).forEach(card - list.add(Integer.parseInt(card)));

   12 }catch (NumberFormatException e) {

   13 System.out.println("请输入数字,牌的点数在1-13");

   14 }

   15 AtomicBoolean isCorrect = new AtomicBoolean(true);

   16 list.forEach(item - isCorrect.set(item = 13 item = 1));

   17 if(!isCorrect.get()){

   18 System.out.println("----请输入数字,牌的点数在1-13");

   19 }

   20 calculateAll(list);

   21 }

   23 /**

   24 * 计算所有可能的分配方式,并找到使用卡牌最多的组合方式

   25 * @param list 所有输入的数字

   26 */

   27 private static void calculateAll(List Integer list){

   28 //存放所有的可行分配方式

   29 List Pair Integer,Pair String,String okResult = new ArrayList ();

   30 //存放使用牌数最多的分配方式

   31 List Pair Integer,Pair String,String okResultLast = new ArrayList ();

   32 //存放所有数字的组合

   33 List Pair Integer,Pair Integer,String result = new ArrayList ();

   34 //用于存放已经找到的分配方式,排除重复分配

   35 List String listAdd = new ArrayList ();

   36 //获取所有的数字组合方式

   37 getAllComb(list,result);

   38 int countNum = 0;

   39 //遍历所有组合方式

   40 for (int i = 0; i result.size(); i++) {

   41 /*

   42 * 思路

   43 * 1.取出其中一种组合,拿到这个组合的点数和sum

   44 * 2.将当前组合中的所有数字放在一个List--currentList中

   45 * 3.从原来得包含所有点数的卡牌集合中筛选出去掉currentList所有数字的其他数字,放在listLeft中

   46 * 5.获得listLeft中所有数字的全部组合方式,放在result1中

   47 * 6.遍历result1,比对总和与sum是否相等,相等则为一种成功的组合方式。

   48 * 7.找到成功组合中使用卡牌最多的组合方式

   49 */

   50 Pair Integer,Pair Integer,String pair = result.get(i);

   51 int sum = pair.getValue().getKey();

   52 int numCount = pair.getKey();

   53 String com = pair.getValue().getValue();

   54 String[] numStr = com.split(",");

   55 List Integer listLeft = new ArrayList ();

   56 List Integer currentList = new ArrayList ();

   57 for (int j = 0; j numStr.length; j++) {

   58 currentList.add(Integer.parseInt(numStr[j]));

   59 }

   60 for (int j = 0; j list.size(); j++) {

   61 if(!currentList.contains(list.get(j))) listLeft.add(list.get(j));

   62 }

   63 List Pair Integer,Pair Integer,String result1 = new ArrayList ();

   64 getAllComb(listLeft,result1);

   65 for (int j = 0; j result1.size(); j++) {

   66 Pair Integer,Pair Integer,String pair1 = result1.get(j);

   67 int leftSum = pair1.getValue().getKey();

   68 int leftCount = pair1.getKey();

   69 String com1 = pair1.getValue().getValue();

   70 countNum = countNum == 0 ? numCount + leftCount : countNum;

   71 if(leftSum == sum countNum = numCount + leftCount){

   72 //计数,如果组合中的数字个数更大,则移除结果集,重新添加,只保存最多的

   73 if(countNum != 0 countNum numCount+leftCount){

   74 countNum = numCount + leftCount;

   75 okResultLast.clear();

   76 }

   77 //去除牌堆左右互换的匹配组合

   78 if(listAdd.contains(com1) listAdd.contains(com)) continue;

   79 listAdd.add(com1);

   80 okResult.add(new Pair (numCount+leftCount,new Pair (com,com1)));

   81 okResultLast.add(new Pair (numCount+leftCount,new Pair (com,com1)));

   82 }

   83 }

   84 }

   85 // System.out.println("所有组合:");

   86 // for (int i = 0; i okResult.size(); i++) {

   87 // Pair Integer,Pair String,String resultPair = okResult.get(i);

   88 // System.out.println("组合的总牌数:"+resultPair.getKey() +

   89 // " === 组合1为: " + resultPair.getValue().getKey() +

   90 // " === 组合2为: " + resultPair.getValue().getValue());

   91 // }

   92 System.out.println("=================================================");

   93 System.out.println("使用卡牌最多的组合方式:");

   94 System.out.println("=================================================");

   95 for (int i = 0; i okResultLast.size(); i++) {

   96 Pair Integer,Pair String,String resultPair = okResultLast.get(i);

   97 System.out.println("当前分配式方"+(i+1)+"总牌数:"+resultPair.getKey() +

   98 "\n==== 堆一卡牌点数分别为: " + resultPair.getValue().getKey() +

   99 "\n==== 堆二卡牌点数分别为: " + resultPair.getValue().getValue());

  100 }

  101 System.out.println("=================================================");

  102 }

  104 /**

  105 * 获得所有可能的组合

  106 * 如数字列表为:【1,2,3】

  107 * 那么得到的所有组合为【1】,【2】,【3】,【1,2】,【1,3】,【2,3】,【1,2,3】

  108 * @param list 所有数字

  109 * @param result 返回的组合集合

  110 */

  111 private static void getAllComb(List Integer list,List Pair Integer,Pair Integer,String result){

  112 List String com = new ArrayList ();

  113 for (int i = 1; i != list.size() + 1; i++) {

  114 ComputCombinations.getCombination(result,list,0,i,com);

  115 }

  116 // result.stream().forEach(item - System.out.println("数字数:"+ item.getKey()+

  117 // "===== 总值:"+ item.getValue().getKey()+ " 内容:" + item.getValue().getValue()));

  118 }

  119 }

 

  计算数字组合的算法:

  

 1 public static void getCombination(List Pair Integer,Pair Integer,String result,

 

   2 List Integer list, int start, int len , List String com){

   3 if(len == 0){

   4 String s = "";

   5 for (int i = 0; i != com.size() ; i++) {

   6 s = s.concat(com.get(i));

   8 String comStr = s.substring(0,s.length() - 1);

   9 String[] all = comStr.split(",");

  10 AtomicInteger sum = new AtomicInteger();

  11 Arrays.stream(all).forEach(item - sum.addAndGet(Integer.parseInt(item)));

  12 result.add(new Pair (com.size(),new Pair (sum.get(),comStr)));

  13 return;

  15 if(start == list.size()){

  16 return;

  18 com.add(list.get(start)+",");

  19 getCombination(result,list, start+1,len - 1,com);

  20 com.remove(com.size()-1);

  21 getCombination(result,list,start+1,len,com);

  22 }

 

  

  测试结果:

  

  

  有可以改进的地方,欢迎指出...

  以上就是张昌蒲 严教 卡牌计算器()的详细内容,想要了解更多 张昌蒲 严教 卡牌计算器的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: