`
michelecindy
  • 浏览: 173096 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

24点游戏的算法

    博客分类:
  • Java
阅读更多
package ceshi;

/** 给定4个数字计算24 */
public class Core {

 private double expressionResult = 24;
 // private int maxLine=10;
 private boolean error = true;
 private double numbers[] = new double[4];
 public Object resultReturn;

 /**
  * 该对象拥有3个私有变量 expressionResult,所需结果 maxLine,输出结果每页行数 error,是否出错
  * numbers[4],记录用来运算的4个数
  * 
  * 其次,该对象拥有以下方法供外部调用 setNumbers(double[] <运算的数>) 输入用来运算的数,4个时才能计算,无返回
  * setMaxLine(int <行数>) 输入每页的行数,无返回 getMaxLine() 返回每页的行数,类型为int
  * setExpressionResult(double <所需结果>) 输入所需结果,无返回 getExpressionResult()
  * 返回所需结果,类型为double getExpression() 返回可得出所需结果的表达式,类型为字符串数组
  * 
  * 最后,私有方法均为计算与表达式转换部分
  */

 // 测试使用
 public static void main(String[] args) {
  Core s = new Core();
  s.setNumbers(new int[] { 3, 4, 8, 6 });
  String[] output = s.getExpression();
  for (int i = 0; i < output.length; i++) {
   System.out.println(output[i]);
  }
 }

 /** 设定被计算的四个数,由于是数组,所以具有容错功能(不为4个数) */
 public void setNumbers(double[] n) {
  if (n.length == 4) {
   error = false;
   numbers = n;
  } else
   error = true;
 }

 public void setNumbers(int[] n) {
  if (n.length == 4) {
   error = false;
   for (int i = 0; i < 4; i++) {
    numbers[i] = n[i];
   }
  } else
   error = true;
 }

 /** 设定每页显示的行数 */
 // public void setMaxLine(int n) {
 // if (n>0) {
 // maxLine=n;
 // }
 // }
 // /** 返回每页显示的行数 */
 // public int getMaxLine() {
 // return maxLine;
 // }
 /** 设定需要得到的结果 */
 public void setExpressionResult(double n) {
  expressionResult = n;
 }

 /** 返回所需结果 */
 public double expressionResult() {
  return expressionResult;
 }

 /** 返回符合条件的表达式 */
 public String[] getExpression() {
  if (!error) {
   String[] expression = calculate(numbers);
   return expression;
  } else
   return new String[] { "出错了,输入有误" };
 }

 /** cal24(),输出结果为24的表达式 */
 private String[] calculate(double[] n) {
  if (n.length != 4)
   return new String[] { "Error" };
  double[] n1 = new double[3];
  double[] n2 = new double[2];
  String[] resultString = new String[1024]; // 最多1000组解,暂时未溢出
  int count = 0;
  boolean isRepeat = false;
  for (int t1 = 0; t1 < 6; t1++) {
   for (int c1 = 0; c1 < 6; c1++) {
    for (int t2 = 0; t2 < 3; t2++) {
     for (int c2 = 0; c2 < 6; c2++) {
      for (int c3 = 0; c3 < 6; c3++) {
       if ((c1 / 3 == c2 / 3 && (c1 % 3) * (c2 % 3) != 0)
         || (c2 / 3 == c3 / 3 && (c2 % 3) * (c3 % 3) != 0)
         || (c1 / 3 == c3 / 3
           && (c1 % 3) * (c3 % 3) != 0 && t2 == 2)) {
        // 去除连减连除的解,因为x/(y/z)=x*z/y
        continue;
       }
       n1 = cal1(n, t1, c1);
       n2 = cal2(n1, t2, c2);
       double result = cal(n2[0], n2[1], c3);
       if ((result - expressionResult) < 0.00000001
         && (expressionResult - result) < 0.00000001) {
        resultString[count] = calString(n, t1, c1, t2,
          c2, c3)
          + "=" + (int) expressionResult;
        for (int i = 0; i < count; i++) {
         isRepeat = false;
         if (resultString[i]
           .equals(resultString[count])) { // 去除完全重复的解
          isRepeat = true;
          break; // 提前退出循环
         }
        }
        if (c1 == c2 && c2 == c3 && c1 % 3 == 0
          && t1 + t2 != 0) { // 连加连乘
         isRepeat = true;
        }
        if (!isRepeat) {
         count++;
        }
       }
      }
     }
    }
   }
  }
  if (count == 0)
   return new String[] { "该组数无解" };
  String[] resultReturn = new String[count];
  System.arraycopy(resultString, 0, resultReturn, 0, count);
  return resultReturn;
 }

 /** cal1(),将4个数计算一次后返回3个数 */
 private double[] cal1(double[] n, int t, int c) { // t为原来的t1,c为原来的c1
  double[] m = new double[3];
  switch (t) {
  case 0:
   m[1] = n[2];
   m[2] = n[3];
   m[0] = cal(n[0], n[1], c);
   break;
  case 1:
   m[1] = n[1];
   m[2] = n[3];
   m[0] = cal(n[0], n[2], c);
   break;
  case 2:
   m[1] = n[1];
   m[2] = n[2];
   m[0] = cal(n[0], n[3], c);
   break;
  case 3:
   m[1] = n[0];
   m[2] = n[3];
   m[0] = cal(n[1], n[2], c);
   break;
  case 4:
   m[1] = n[0];
   m[2] = n[2];
   m[0] = cal(n[1], n[3], c);
   break;
  default:
   m[1] = n[0];
   m[2] = n[1];
   m[0] = cal(n[2], n[3], c);
  }
  return m;
 }

 /** cal2(),将3个数计算一次后返回2个数 */
 private double[] cal2(double[] n, int t, int c) { // t为原来的t2,c为原来的c2
  double[] m = new double[2];
  switch (t) {
  case 0:
   m[1] = n[2];
   m[0] = cal(n[0], n[1], c);
   break;
  case 1:
   m[1] = n[1];
   m[0] = cal(n[0], n[2], c);
   break;
  default:
   m[1] = n[0];
   m[0] = cal(n[1], n[2], c);
  }
  return m;
 }

 /** cal(),将2个数计算后返回结果 */
 private double cal(double n1, double n2, int c) { // n1,n2为运算数,c为运算类型
  switch (c) {
  case 0:
   return n1 + n2;
  case 1:
   return n1 - n2;
  case 2:
   return n2 - n1;
  case 3:
   return n1 * n2;
  case 4:
   if (n2 == 0)
    return 9999; // 使计算结果必不为24
   else
    return n1 / n2;
  default:
   if (n1 == 0)
    return 9999; // 同上
   else
    return n2 / n1;
  }
 }

 /** calString(),输出表达式 */
 private String calString(double[] n, int t1, int c1, int t2, int c2, int c3) {
  String[] nString = new String[4];
  switch (t1) {
  case 0:
   nString[0] = calString2("" + (int) n[0], "" + (int) n[1], c1);
   nString[1] = "" + (int) n[2];
   nString[2] = "" + (int) n[3];
   break;
  case 1:
   nString[0] = calString2("" + (int) n[0], "" + (int) n[2], c1);
   nString[1] = "" + (int) n[1];
   nString[2] = "" + (int) n[3];
   break;
  case 2:
   nString[0] = calString2("" + (int) n[0], "" + (int) n[3], c1);
   nString[1] = "" + (int) n[1];
   nString[2] = "" + (int) n[2];
   break;
  case 3:
   nString[0] = calString2("" + (int) n[1], "" + (int) n[2], c1);
   nString[1] = "" + (int) n[0];
   nString[2] = "" + (int) n[3];
   break;
  case 4:
   nString[0] = calString2("" + (int) n[1], "" + (int) n[3], c1);
   nString[1] = "" + (int) n[0];
   nString[2] = "" + (int) n[2];
   break;
  default:
   nString[0] = calString2("" + (int) n[2], "" + (int) n[3], c1);
   nString[1] = "" + (int) n[0];
   nString[2] = "" + (int) n[1];
  }
  if ((c2 / 3 > c1 / 3 && (t2 != 2 || c2 / 3 == c3 / 3))
    || ((c3 / 3 > c1 / 3 + c2 / 3) && t2 == 2)
    || (c3 == 1 && c1 / 3 == 0)) // 特定情况下加上一个括号*****************************
   nString[0] = '(' + nString[0] + ')';
  switch (t2) {
  case 0:
   nString[0] = calString2(nString[0], "" + nString[1], c2);
   nString[1] = nString[2];
   break;
  case 1:
   nString[0] = calString2(nString[0], nString[2], c2);
   break;
  default:
   nString[3] = nString[0];
   nString[0] = calString2(nString[1], nString[2], c2);
   nString[1] = nString[3];
  }
  if (c3 / 3 > c2 / 3 || (c3 == 2 && nString[0].indexOf('+') >= 0)) // 特定情况下加上一个括号*****************************
   nString[0] = '(' + nString[0] + ')';
  return calString2(nString[0], nString[1], c3);
 }

 /** calString(),根据符号输出一部运算表达式 */
 private String calString2(String n1, String n2, int c) {
  switch (c) {
  case 0:
   return n1 + '+' + n2;
  case 1:
   return n1 + '-' + n2;
  case 2:
   return n2 + '-' + n1;
  case 3:
   return n1 + '*' + n2;
  case 4:
   return n1 + '/' + n2;
  default:
   return n2 + '/' + n1;
  }
 }

}
分享到:
评论

相关推荐

    24点游戏算法.rar

    在提供的压缩包中,"24点.pptx"可能是关于24点游戏算法的详细讲解或示例,"cppunit-1.12.1"是一个C++测试框架,可能用于编写和测试算法代码,"project"和"testcase"可能包含了项目的源码和测试用例,而"source"可能...

    24点游戏的算法及实现

    24点游戏是一种深受人们喜爱的智力挑战游戏,它的目标是通过加、减、乘、除运算,将给出的四个1到13之间的数字组合成24。这个游戏考验玩家的逻辑思维和数学技能。本文将深入探讨24点游戏的算法实现,并提供详细的...

    java 24点小游戏算法

    【原创】2010年全国软件专业人才设计与开发大赛决赛样题 -- 24点小游戏算法 网上找了些java实现24点小游戏的算法,看了一下,头都晕了! 自己写了一个类,各位可以看一下思路,如果需要的话,只要实例化PointGame...

    24点算法的实现(24点游戏源码).

    24点游戏是一种广受欢迎的智力游戏,玩家需要在四张扑克牌中通过加减乘除运算找出一种或多种方式使结果等于24。在这个场景中,我们关注的是"24点算法的实现",这涉及到编程技术,尤其是C++语言,以及可能用到的图形...

    24点扑克游戏算法参考

    通过上述分析,我们可以看到24点游戏算法的设计和实现涵盖了递归、回溯、搜索、数据结构、枚举、优化策略以及面向对象设计等多个计算机科学的核心概念。理解并实现这样的算法,不仅可以锻炼我们的逻辑思维能力,也是...

    优化24点牌js算法

    24点牌js算法,24点牌js算法,24点牌js算法

    c#24点游戏

    通常,24点游戏会给玩家四张1到13之间的扑克牌,目标是通过加、减、乘、除(可使用括号改变运算顺序)来得到24的结果。算法需要遍历所有可能的运算组合,并检查是否能得出24。这需要对数字的排列组合有深入的理解,...

    C#实现的算24点游戏算法实例分析

    为了实现完整的24点游戏算法,还需要实现以下关键功能: 1. **生成所有可能的组合**:这涉及到对数字和符号进行排列组合,同时考虑运算符的优先级。 2. **计算表达式**:使用`Evaluate()`方法对构建的表达式进行求...

    24点算法 课程设计

    24点游戏是一种数学游戏,通常由四张扑克牌组成,玩家需要利用加、减、乘、除(每张牌只能用一次)来使结果等于24。以下是对这段代码的关键知识点进行详细解析。 ### 24点算法核心概念 1. **基本思路**:该算法...

    关于二十四点游戏的基本算法.rar_二十四点

    在解决二十四点游戏的过程中,我们需要掌握一些基本的算法策略。首先,可以尝试对四张牌进行两两组合,看是否能得到12或者12的倍数,因为24是12的两倍。例如,可以先计算两个数的乘积,如果得到的乘积是12或其倍数,...

    24点游戏C语言

    24点算法C语言程序,可以随机生成4个数字,然后都可以让计算机解答。自己都可以输入数据解答。

    24点算法及程序

    标题中的“24点算法及程序”指的是一个数学游戏,玩家需要从四张包含1到13的扑克牌中,通过加、减、乘、除和括号的操作,使得计算结果等于24。这个概念在计算机编程中可以转化为一个算法问题,即编写一个程序来自动...

    24点算法Java源码

    24点游戏算法Java源码 80年代全世界流行一种数字游戏,在中国我们把这种游戏称为“24点”。现在我们 把这个有趣的游戏推广一下:您作为游戏者将得到6个不同的自然数作为操作数, 以及另外一个自然数作为理想目标...

    关于二十四点游戏的编程思路与基本算法.rar_二十四点_二十四点游戏

    二十四点游戏是一款基于数学逻辑和计算技巧的娱乐活动,它要求玩家从四张1到13的扑克牌中,通过加、减、乘、除运算得出24的结果。在这个问题中,我们将探讨如何利用编程来解决这个问题,以及涉及到的相关算法。 ...

    C语言原程序二十四点游戏的编程思路与基本算法.txt

    ### C语言原程序二十四点游戏的编程思路与基本算法 #### 一、二十四点游戏简介 二十四点游戏是一种数学益智游戏,玩家需要利用给定的四张牌(每张牌上的数字范围一般为1至13),通过加、减、乘、除四种运算(可以...

    c#关于24点算法

    24点算法是一种经典的数学游戏,源自中国的扑克牌游戏,目标是通过加减乘除运算,使四张1到13之间的数字牌得出24。在编程领域,我们可以用C#来实现这个算法,将其转化为计算机可以处理的问题。下面将详细探讨如何用...

    算24点 24点算法 源代码和程序

    24点游戏,作为一个经典而富有挑战性的数学游戏,深受广大玩家喜爱。它基于四则运算,通过加、减、乘、除运算,使得四个给定的自然数(通常是1到13之间)组合运算后得到结果为24。本文将深入探讨24点算法,并结合...

    计算24点算法

    "计算24点"是一个经典的数学游戏,挑战玩家利用加减乘除运算符以及括号,将四张扑克牌上的数字组合成24。在这个问题中,我们要讨论的是实现这个功能的算法,即如何设计一个程序自动找到这些计算公式。 首先,我们...

    二十四点游戏

    【二十四点游戏】是一种经典的数学智力游戏,玩家需要利用加减乘除运算,将四张牌上的数字组合成24。这个游戏对玩家的逻辑思维、数学运算能力有很好的锻炼作用。在编程领域,实现24点游戏算法是一个有趣的挑战。 ...

    24点游戏Java实现

    24点游戏Java实现,界面Javafx实现,一副牌中抽去大小王剩下 52 张(如果初练也可只用 1~10 这 40 张牌),任意抽取 4 张牌 (称牌组),用加、减、乘、除(可加括号)把牌面上的数算成 24。每张牌必须用一次且只能用 一...

Global site tag (gtag.js) - Google Analytics