扑克牌计算24点的Java算法实现

本文提供了一种解决经典24点游戏问题的算法实现,通过动态加载计算符号和数值来寻找所有可能的答案组合,并利用最大公约数和最小公倍数进行分数运算,确保计算准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是网上找来的代码,感谢原作者的精彩实现。(我已经记不得是什么时候在哪里看来的了,呵呵)

  1. package com.chanson;
  2. /*
  3.  * @date   Aug 3, 2006
  4.  * @project 学习
  5.  * @company 个人
  6.  * @author  chanson
  7.  * @version 1.0
  8.  */
  9. import java.util.HashMap;
  10. public class TwentyFour {
  11.     
  12.     private int[] aArray = new int[2];
  13.     private int[] bArray = new int[2];
  14.     private int[] cArray = new int[2];
  15.     private int[] dArray = new int[2];
  16.     
  17.     /**
  18.      * main方法
  19.      * 
  20.      * @param args
  21.      */
  22.     public static void main(String[] args) {
  23.         new TwentyFour().dispose(3458);
  24.     }
  25.     
  26.     public void dispose(int a, int b, int c, int d){
  27.         aArray[0] = a;
  28.         aArray[1] = 1;
  29.         bArray[0] = b;
  30.         bArray[1] = 1;
  31.         cArray[0] = c;
  32.         cArray[1] = 1;
  33.         dArray[0] = d;
  34.         dArray[1] = 1;
  35.         core(aArray, bArray, cArray, dArray);
  36.     }
  37.     
  38.     /**
  39.      * 加
  40.      */
  41.     public  int[] plus(int[] a, int[] b){
  42.         
  43.         if(0 == a[1]){
  44.             return new int[]{0,0};
  45.         }
  46.         if(0 == b[1]){
  47.             return new int[]{0,0};
  48.         }
  49.         int denominator = leaseCommonMultiple(a[1],b[1]);
  50.         
  51.         return new int[]{denominator/a[1]*a[0] + denominator/b[1]*b[0] ,denominator};
  52.     }
  53.     
  54.     /**
  55.      * 减
  56.      * @param a
  57.      * @param b
  58.      * @return
  59.      */
  60.     public  int[] reduce(int[] a, int[] b){
  61.         if(0 == a[1]){
  62.             return new int[]{0,0};
  63.         }
  64.         if(0 == b[1]){
  65.             return new int[]{0,0};
  66.         }
  67.         int denominator = leaseCommonMultiple(a[1],b[1]);
  68.         
  69.         return new int[]{denominator/a[1]*a[0] - denominator/b[1]*b[0] ,denominator};
  70.     }
  71.     
  72.     /**
  73.      * 乘
  74.      * @param a
  75.      * @param b
  76.      * @return
  77.      */
  78.     public  int[] multiply(int[] a, int[] b){
  79.         return new int[]{a[0] * b[0], a[1] * b[1]};
  80.     }
  81.     
  82.     /**
  83.      * 除
  84.      * @param a
  85.      * @param b
  86.      * @return
  87.      */
  88.     public  int[] divide(int[] a, int[] b){
  89.         return new int[]{a[0] * b[1], a[1] * b[0]};
  90.     }
  91.     
  92.     /**
  93.      * 求最小公倍数
  94.      * @param a
  95.      * @param b
  96.      * @return
  97.      */
  98.     public  int leaseCommonMultiple(int a, int b){
  99.         return a*b/greatestCommonDivisor(a,b);
  100.     }
  101.     
  102.     /**
  103.      * 求最大公约数
  104.      * @param a
  105.      * @param b
  106.      * @return
  107.      */
  108.     public  int greatestCommonDivisor(int a, int b) {
  109.         if(0 == a && 0 == b){
  110.             return 1;
  111.         }
  112.         if (0 == a) {
  113.             return b;
  114.         }
  115.         if (0 == b) {
  116.             return a;
  117.         }
  118.         if (a > b) {
  119.             int c = a;
  120.             a = b;
  121.             b = c;
  122.         }
  123.         for (int c = a % b; c > 0; c = a % b) {
  124.             a = b;
  125.             b = c;
  126.         }
  127.         return b;
  128.     }
  129.     
  130.     /**
  131.      * 动态加载符号数
  132.      * @param i
  133.      * @param a
  134.      * @param b
  135.      * @return
  136.      */
  137.     public  int[] dispose(int i, int a[], int[] b){
  138.         if(i == 0){
  139.             return plus(a, b);
  140.         }else if(i == 1){
  141.             return reduce(a, b);
  142.         }else if(i == 2){
  143.             return multiply(a, b);
  144.         }else{
  145.             return divide(a, b);
  146.         }
  147.     }
  148.     
  149.     /**
  150.      * 动态加载计算数
  151.      * @param i
  152.      * @param a
  153.      * @param b
  154.      * @param c
  155.      * @param d
  156.      * @return
  157.      */
  158.     public int[] number(int i, int[] a, int[] b, int[] c, int[] d){
  159.         if(i == 0){
  160.             return a;
  161.         }else if(i == 1){
  162.             return b;
  163.         }else if(i == 2){
  164.             return c;
  165.         }else if(i == 3){
  166.             return d;
  167.         }else{
  168.             return new int[]{0,1};
  169.         }
  170.     }
  171.     /**
  172.      * 核心算法部分
  173.      * @param a
  174.      * @param b
  175.      * @param c
  176.      * @param d
  177.      */
  178.     private  void core(int[] a, int[] b, int[] c, int[] d) {
  179.         HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
  180.         
  181.         int count = 0;
  182.         
  183.         for(int i = 0; i < 4; i++){
  184.             for(int j = 0; j < 4; j++){
  185.                 for(int k = 0; k < 4; k++){
  186.                     for(int m = 0; m < 4; m++){
  187.                         for(int n = 0; n < 4; n++){
  188.                             if(n == m)
  189.                                 continue;
  190.                             for(int o = 0; o < 4; o++){
  191.                                 if(o == m || o == n)
  192.                                     continue;
  193.                                 for(int p = 0; p < 4; p++){
  194.                                     if(p == m || p == n || p == o)
  195.                                         continue;
  196.                                     //类型1:A(A(A(a,b),c),d)
  197.                                     int[] result1 = dispose(k,dispose(j,dispose(i,number(m,a,b,c,d),number(n,a,b,c,d)),number(o,a,b,c,d)),number(p,a,b,c,d));
  198.                                     //类型2:A(A(a,A(b,c)),d)
  199.                                     int[] result2 = dispose(k,dispose(i,number(m,a,b,c,d),dispose(j,number(n,a,b,c,d),number(o,a,b,c,d))),number(p,a,b,c,d));
  200.                                     //类型3:A(a,A(b,A(c,d)))
  201.                                     int[] result3 = dispose(i,number(m,a,b,c,d),dispose(j,number(n,a,b,c,d),dispose(k,number(o,a,b,c,d),number(p,a,b,c,d))));
  202.                                     //类型4:A(a,A(A(b,c),d))
  203.                                     int[] result4 = dispose(i,number(m,a,b,c,d),dispose(k,dispose(j,number(n,a,b,c,d),number(o,a,b,c,d)),number(p,a,b,c,d)));                                   
  204.                                     //类型5:A(A(a,b),A(c,d))
  205.                                     int[] result5 = dispose(j,dispose(i,number(m,a,b,c,d),number(n,a,b,c,d)),dispose(k,number(o,a,b,c,d),number(p,a,b,c,d)));
  206.                                     if (0 != result1[1]) {
  207.                                         if (result1[0] % result1[1] == 0) {
  208.                                             if (result1[0] / result1[1] == 24) {
  209.                                                 if ((!map.containsKey(new Integer(i)))|| (!map.containsKey(new Integer(j)))|| (!map.containsKey(new Integer(k)))) {
  210.                                                     map.put(new Integer(i),new Integer(i));
  211.                                                     map.put(new Integer(j),new Integer(j));
  212.                                                     map.put(new Integer(k),new Integer(k));
  213.                                                     count += 1;
  214.                                                     System.out.println("((" + printNumber(m) + printSymbol(i) + printNumber(n) + ")" + printSymbol(j) + printNumber(o) + ")" + printSymbol(k) + printNumber(p));
  215.                                                 }
  216.                                             }
  217.                                         }
  218.                                     }
  219.                                     if (0 != result2[1]) {
  220.                                         if (result2[0] % result2[1] == 0) {
  221.                                             if (result2[0] / result2[1] == 24) {
  222.                                                 if ((!map.containsKey(new Integer(i)))|| (!map.containsKey(new Integer(j)))|| (!map.containsKey(new Integer(k)))) {
  223.                                                     map.put(new Integer(i),new Integer(i));
  224.                                                     map.put(new Integer(j),new Integer(j));
  225.                                                     map.put(new Integer(k),new Integer(k));
  226.                                                     count += 1;
  227.                                                     System.out.println("(" + printNumber(m) + printSymbol(i) +"(" + printNumber(n) + printSymbol(j) + printNumber(o) + "))" + printSymbol(k) + printNumber(p));
  228.                                                 }
  229.                                             }
  230.                                         }
  231.                                     }
  232.                                     if (0 != result3[1]) {
  233.                                         if (result3[0] % result3[1] == 0) {
  234.                                             if (result3[0] / result3[1] == 24) {
  235.                                                 if ((!map.containsKey(new Integer(i))) || (!map.containsKey(new Integer(j)))|| (!map.containsKey(new Integer(k)))) {
  236.                                                     map.put(new Integer(i),new Integer(i));
  237.                                                     map.put(new Integer(j),new Integer(j));
  238.                                                     map.put(new Integer(k),new Integer(k));
  239.                                                     count += 1;
  240.                                                     System.out.println(printNumber(m) + printSymbol(i) +"(" + printNumber(n) + printSymbol(j) + "(" + printNumber(o) +  printSymbol(k) + printNumber(p) + "))");
  241.                                                 }
  242.                                             }
  243.                                         }
  244.                                     }
  245.                                     if (0 != result4[1]) {
  246.                                         if (result4[0] % result4[1] == 0) {
  247.                                             if (result4[0] / result4[1] == 24) {
  248.                                                 if ((!map
  249.                                                         .containsKey(new Integer(i)))|| (!map.containsKey(new Integer(j)))|| (!map.containsKey(new Integer(k)))) {
  250.                                                     map.put(new Integer(i),new Integer(i));
  251.                                                     map.put(new Integer(j),new Integer(j));
  252.                                                     map.put(new Integer(k),new Integer(k));
  253.                                                     count += 1;
  254.                                                     System.out.println(printNumber(m) + printSymbol(i) +"((" + printNumber(n) + printSymbol(j) + printNumber(o) + ")" +  printSymbol(k) + printNumber(p) + ")");
  255.                                                 }
  256.                                             }
  257.                                         }
  258.                                     }
  259.                                     if (0 != result5[1]) {
  260.                                         if (result5[0] % result5[1] == 0) {
  261.                                             if (result5[0] / result5[1] == 24) {
  262.                                                 if ((!map.containsKey(new Integer(i)))|| (!map.containsKey(new Integer(j)))|| (!map.containsKey(new Integer(k)))) {
  263.                                                     map.put(new Integer(i),new Integer(i));
  264.                                                     map.put(new Integer(j),new Integer(j));
  265.                                                     map.put(new Integer(k),new Integer(k));
  266.                                                     count += 1;
  267.                                                     System.out.println("(" + printNumber(m) + printSymbol(i) + printNumber(n) + ")" + printSymbol(j) + "(" + printNumber(o) + printSymbol(k) + printNumber(p) + ")");
  268.                                                 }
  269.                                             }
  270.                                         }
  271.                                     }
  272.                                 }
  273.                             }
  274.                         }
  275.                     }
  276.                 }
  277.             }
  278.         }
  279.         //总共几种答案,过滤了类似的答案 
  280.         System.out.println("count: " + count);
  281.     }
  282.     
  283.     public int printNumber(int i){
  284.         if(i == 0){
  285.             return aArray[0];
  286.         }
  287.         if(i == 1){
  288.             return bArray[0];
  289.         }
  290.         if(i == 2){
  291.             return cArray[0];
  292.         }
  293.         if(i == 3){
  294.             return dArray[0];
  295.         }
  296.         return 0;
  297.     }
  298.     
  299.     public String printSymbol(int i){
  300.         
  301.         if(i == 0){
  302.             return " + ";
  303.         }
  304.         if(i == 1){
  305.             return " - ";
  306.         }
  307.         if(i == 2){
  308.             return " * ";
  309.         }
  310.         if(i == 3){
  311.             return " / ";
  312.         }
  313.         return "";
  314.     }
  315. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值