编程之美1.1624点游戏解法一java版

原创 2016年06月01日 13:43:15

书中给出的第一种解法的java版

根据给的思路可以得出是否能算出24的结论,但是没办法输出表达式

值得注意的地方:1.将两个取出来的数从原数组中去掉,代码中采用的方法很巧妙,用数组后面的值和新计算出的值来代替,这样做的好处是还原数组也很简单

                                 2.输出表达式的地方还没想出怎么解决

扩展问题一:3,3,8,8程序给出的结论是false

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Test;

import java.math.BigDecimal;
import static java.math.BigDecimal.ROUND_HALF_DOWN;
import java.util.*;

/**
 *
 * @author Administrator
 */
public class PointsGame {

    static double[] number = {9, 9, 6, 2};
    static String[] result =new String[4];

    public static void main(String[] args) {
        for(int i =0;i<4;i++){
            result[i] ="";
        }
        boolean flag = pointsGame(4);
        System.out.println("flag="+flag);
       for(int i =0;i<4;i++){
            System.out.println(result[i]);
        }
    }

    private static boolean pointsGame(int n) {
        if (n < 2) {
            if (number[0] == 24) {
                return true;
            } else {
                return false;
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                double a, b;
                String expa,expb;
                a = number[i];
                b = number[j];
                number[j]=number[n-1];
                
                expa=result[i];
                expb=result[j];
                result[j]=result[n-1];
                
                result[i]="("+expa+"+"+expb+")";
                number[i] = a+b;
                if(pointsGame(n-1))
                    return true;
                
                result[i]="("+expa+"-"+expb+")";
                number[i]=a-b;
                if(pointsGame(n-1))
                    return true;
                
                result[i]="("+expb+"-"+expa+")";
                number[i]=b-a;
                if(pointsGame(n-1))
                    return true;
                
                result[i]="("+expa+"*"+expb+")";
                number[i]=a*b;
                if(pointsGame(n-1))
                    return true;
                
                if(b!=0){
                    result[i]="("+expa+"/"+expb+")";
                    number[i]=a/b;
                    if(pointsGame(n-1))
                    return true;
                }
                if(a!=0){
                    result[i]="("+expb+"/"+expa+")";
                    number[i]=b/a;
                    if(pointsGame(n-1))
                    return true;
                }
                number[i]=a;
                number[j]=b;
                result[i]=expa;
                result[j]=expb;
                        
            }
        }
        return false;
    }

   
}
                运行结果:true (((+)-)*)

编程之美--游戏之乐--1.4买书问题(改进解法)

原版解法以及改进解法均给出改进解法思路展示:假设输入为[7,6,5,4,3] 通过某个过程达到了[3,3,3,3,3]这种状态 那么这时候的结果res+=5*0.25*3即可 不需要继续执行下去 同理...

编程之美-2.7最大公约数问题java解法

编程之美-最大公约数问题java解法 包括五种方法,最后有一个判断奇偶数的方法isEven(); package code.beauty.fungame; public clas...

java并发编程--一道经典多线程题的2种解法

原文:http://coolxing.iteye.com/blog/1236696 问题的描述 启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,...

java并发编程--一道经典多线程题的2种解法

Java代码   "line-height: 18px; white-space: normal;">coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]   ...
  • xdy3008
  • xdy3008
  • 2012年09月13日 17:03
  • 1489

Java编程能力强化(2)——搜索解决方案类问题的通用解法

本文给出了搜索解决方案类问题的通用解法,并结合狼羊过河例子进行了分析。...

java并发编程--一道经典多线程题的2种解法

问题的描述 启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18...

腾讯马拉松编程大赛威威猫系列故事——吃鸡腿 java编程解法

Problem Description   威威猫不是一只普通的猫,普通的猫喜欢吃鱼,但威威猫最喜欢吃鸡腿。他每天都在不停的吃啊吃,吃了一只又一只鸡腿。现在他遇到了一个难题,如果他的体重太胖那么他的...

《编程之美》1.4买书问题的常数时间解法

《编程之美》1.4买书问题的常数时间解法

《编程之美: 求二叉树中节点的最大距离》的另一个解法

昨天花了一个晚上为《编程之美》,在豆瓣写了一篇书评《迟来的书评和感想──给喜爱编程的朋友》。书评就不转载到这里了,取而代之,在这里介绍书里其中一条问题的另一个解法。这个解法比较简短易读及降低了空间复杂...
  • wbw1985
  • wbw1985
  • 2012年10月22日 19:22
  • 1028
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编程之美1.1624点游戏解法一java版
举报原因:
原因补充:

(最多只允许输入30个字)