24点算法

题目:给四个数,用+,-,*,/进行组合,使得结果的等于24,如:1,5,5,5,则(5-1/5)*5=24

下面是我自己的算法,没有对算术表达式进行过滤~比如会认为((9-8)+7)*3 = 24和((9+7)-8)*3 = 24是不同的表达式组合

Java SE6编译通过,如有缺点请指正~

ContractedBlock.gif ExpandedBlockStart.gif 24点算法
  1import java.util.*;
  2
  3ExpandedBlockStart.gifContractedBlock.gif/** *//**
  4 * 24点算法
  5 */

  6class Create24
  7ExpandedBlockStart.gifContractedBlock.gif{
  8    public static void main(String[] args) 
  9ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 10        // 存放4个整数
 11        List<Float> dold = new ArrayList<Float>();
 12        
 13        // 初始化,添加四个整数
 14        dold.add(9f);
 15        dold.add(8f);
 16        dold.add(7f);
 17        dold.add(3f);
 18        
 19        // 根据四个整数得出所有的排序情况
 20        List<List<Float>> dd = creatNum(dold);
 21        
 22        // 打印出可能的序列
 23        System.out.println("共有" + dd.size() + "排序方式!");
 24        for (List<Float> x : dd) 
 25ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 26            for (float xx : x)
 27ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 28                System.out.print((int)xx + " ");
 29            }

 30            System.out.println("");
 31        }

 32        
 33        // 记录所有的计算结果
 34        List<List<Float>> tmp2 = new ArrayList<List<Float>>();
 35    
 36        // 记录所有的表达式
 37        List<String> strList2 = new ArrayList<String>();
 38        
 39        // 得到所有可能的结果和表达式
 40        calcReuslt(dd, tmp2, strList2);
 41        
 42        // 打印出所有可能等于24的算术表达式
 43        int hh = 0;
 44ExpandedSubBlockStart.gifContractedSubBlock.gif        for(List<Float> l1 : tmp2){
 45ExpandedSubBlockStart.gifContractedSubBlock.gif            for(float j1 : l1){
 46                if (j1 == 24)
 47ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 48                    System.out.println((strList2.get(hh)) + " = " + (int)j1);
 49                }
 else if (j1 == -24)
 50ExpandedSubBlockStart.gifContractedSubBlock.gif                {    
 51                    // 得数为负值时需要在表达式前加负号
 52                    System.out.println("-" + (strList2.get(hh)) + " = " + (int)(-j1));
 53                }

 54                hh++;
 55            }

 56        }

 57        
 58    }

 59    
 60ExpandedSubBlockStart.gifContractedSubBlock.gif    /** *//**
 61     * 得到所有可能的结果和表达式
 62     */

 63ExpandedSubBlockStart.gifContractedSubBlock.gif    private static void calcReuslt (List<List<Float>> dd, List<List<Float>> tmp2, List<String> strList2) {
 64
 65        for (List<Float> d : dd)
 66ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 67            // 得到第一个和第二数字的计算结果
 68            List<Float> tmp0 = calcTwoNum(d.get(0), d.get(1));
 69
 70            // 存放第一个和第二数字的表达式
 71            List<String> strList0 = new ArrayList<String>();
 72            // 得到第一个和第二数字的表达式
 73            creatStr(strList0, String.valueOf(d.get(0).intValue()), String.valueOf(d.get(1).intValue()), 1);
 74
 75            // 存放第一、第二数字的计算结果和第三个数字的计算结果
 76            List<List<Float>> tmp1 = new ArrayList<List<Float>>();
 77            // 存放第一、第二数字的计算结果和第三个数字的表达式
 78            List<String> strList1 = new ArrayList<String>();
 79
 80            int ii = 0;
 81ExpandedSubBlockStart.gifContractedSubBlock.gif            for(float i : tmp0){
 82
 83                // 得到第一、第二数字的计算结果和第三个数字的计算结果
 84                tmp1.add(calcTwoNum(i, d.get(2)));
 85
 86                // 得到第一、第二数字的计算结果和第三个数字的表达式
 87                creatStr(strList1, strList0.get(ii), String.valueOf(d.get(2).intValue()), 1);
 88
 89                ii++;
 90            }

 91
 92            int gg = 0;
 93ExpandedSubBlockStart.gifContractedSubBlock.gif            for(List<Float> l : tmp1){
 94ExpandedSubBlockStart.gifContractedSubBlock.gif                for(float j : l){
 95                    // 得到前三个数字和第四个数字的计算结果
 96                    tmp2.add(calcTwoNum(j, d.get(3)));
 97
 98                    // 得到前三个数字和第四个数字的表达式
 99                    creatStr(strList2, strList1.get(gg), String.valueOf(d.get(3).intValue()), 0);
100
101                    gg++;
102                }

103            }

104
105        }

106    }

107    
108ExpandedSubBlockStart.gifContractedSubBlock.gif    /** *//**
109     * 组合表达式
110     */

111ExpandedSubBlockStart.gifContractedSubBlock.gif    private static void creatStr(List<String> l, String a, String b, int hasBracket) {
112ExpandedSubBlockStart.gifContractedSubBlock.gif        String[] operatorArr = {"+""-""*""/"};
113        
114        for (String opr : operatorArr)
115ExpandedSubBlockStart.gifContractedSubBlock.gif        {
116            // 需要括号
117            if (hasBracket == 1)
118ExpandedSubBlockStart.gifContractedSubBlock.gif            {
119                l.add("(" + a + opr + b + ")");
120ExpandedSubBlockStart.gifContractedSubBlock.gif            }
 else {
121                l.add(a + opr + b);
122            }

123        }

124    }

125
126ExpandedSubBlockStart.gifContractedSubBlock.gif    /** *//**
127     * 得出所有的排序情况
128     */

129ExpandedSubBlockStart.gifContractedSubBlock.gif    private static List<List<Float>> creatNum(List<Float> d) {
130        List<List<Float>> a = new ArrayList<List<Float>>();
131        
132        if (d.size() == 1)
133ExpandedSubBlockStart.gifContractedSubBlock.gif        {
134            List<Float> dd1 = new ArrayList<Float>();
135            dd1.add(d.get(0));
136            a.add(dd1);
137            return a;
138
139ExpandedSubBlockStart.gifContractedSubBlock.gif        }
 else {
140            for (int j=0;j<d.size();j++)
141ExpandedSubBlockStart.gifContractedSubBlock.gif            {
142                List<Float> d3 = new ArrayList<Float>();
143                
144                // 将传入的List复制出来
145                for (int i=0;i<d.size();i++)
146ExpandedSubBlockStart.gifContractedSubBlock.gif                {
147                    d3.add(d.get(i));
148                }

149
150                float x = d3.get(j);
151                d3.remove(j);
152                
153                // 递归
154                List<List<Float>> tmp1 = creatNum(d3);
155                
156                for (List<Float> l : tmp1)
157ExpandedSubBlockStart.gifContractedSubBlock.gif                {    
158                    List<Float> d2 = new ArrayList<Float>();
159                    // 添加第一位截取的数字
160                    d2.add(x);
161                    // 添加递归后得到的数字
162                    for (float f : l)
163ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
164                        d2.add(f);
165                    }

166                    a.add(d2);
167                }

168            }

169            return a;
170        }

171    }

172
173ExpandedSubBlockStart.gifContractedSubBlock.gif    /** *//**
174     * 得到两个数加减乘除后的结果    
175     */

176ExpandedSubBlockStart.gifContractedSubBlock.gif    private static List<Float> calcTwoNum(float n1, float n2){
177        List<Float> a = new ArrayList<Float>();
178        a.add(n1 + n2);
179        a.add(n1 - n2);
180        a.add(n1 * n2);
181        a.add(n1 / n2);
182         return a;
183    }

184}

转载于:https://www.cnblogs.com/lostheaven/archive/2009/03/06/1404672.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值