24点计算源码

public   class  Point24Utils2 {  
    private   static  String[] opArray = { "+" ,  "-" ,  "*" ,  "-" };  //运算符数组   
    private   static  String[] expArray =  new  String[ 11 ];  //表达式数组   
      
    static {  
        expArray[0 ] =  "a m1 b m2 c m3 d" ;  
        expArray[1 ] =  "(a m1 b) m2 c m3 d" ;  
        expArray[2 ] =  "(a m1 b m2 c) m3 d" ;  
        expArray[3 ] =  "((a m1 b) m2 c) m3 d" ;  
        expArray[4 ] =  "(a m1 (b m2 c)) m3 d" ;  
        expArray[5 ] =  "a m1 (b m2 c) m3 d" ;  
        expArray[6 ] =  "a m1 (b m2 c m3 d)" ;  
        expArray[7 ] =  "a m1 ((b m2 c) m3 d)" ;  
        expArray[8 ] =  "a m1 (b m2 (c m3 d))" ;  
        expArray[9 ] =  "a m1 b m2(c m3 d)" ;  
        expArray[10 ] =  "(a m1 b) m2 (c m3 d)" ;  
    }  
      
    /**  
     * 计算入口方法,返回实际的表达式  
     * @param n 用于计算24点的四个数字组成的数组  
     */   
    private   static  String execute(String[] n){  
        String a,b,c,d; //四个数字   
        String m1,m2,m3; //三个运算符   
          
        for  ( int  i= 0 ;i< 4 ;i++){  
            a = n[i];  
            for  ( int  j= 0 ;j< 4 ;j++){  
                if  ( j == i )  continue ;  //从未选的三个数字中选择一个数字   
                b = n[j];  
                for  ( int  x= 0 ;x< 4 ;x++){  
                    if  ( x == i || x == j )  continue ; //从未选的两个数字中选择一个数字   
                    c = n[x];  
                    for  ( int  y= 0 ;y< 4 ;y++){  
                        if  ( y == i || y == j || y == x )  continue ; //从未选的一个数字中选择一个数字   
                        d = n[y];  
  
                        //选择三个运算符   
                        for  ( int  ta= 0 ;ta< 4 ;ta++){  
                            m1 = opArray[ta];        
                            for  ( int  tb= 0 ;tb< 4 ;tb++){  
                                m2 = opArray[tb];        
                                for  ( int  tc= 0 ;tc< 4 ;tc++){  
                                    m3 = opArray[tc];      
                                    for  ( int  k= 0 ;k< 11 ;k++){  //11种表达式   
                                        String result = calcalate(expArray[k], a, b, c, d, m1, m2, m3);  
                                        if (result!= null )  return  result;  
                                    }  
                                }  
                            }  
                        }  
                    }  
                }  
            }  
        }  
          
        return   null ;  
    }  
      
    /**  
     * 计算表达式  
     *   
     * @param exp 待验证的表达式模板  
     * @param a 数字1  
     * @param b 数字2  
     * @param c 数字3  
     * @param d 数字4  
     * @param m1 运算符1  
     * @param m2 运算符2  
     * @param m3 运算符3  
     */   
    private   static  String calcalate(String exp, String a, String b, String c, String d, String m1, String m2, String m3){  
        //生成计算表达式   
        exp = exp.replaceAll("a" , a);  
        exp = exp.replaceAll("b" , b);  
        exp = exp.replaceAll("c" , c);  
        exp = exp.replaceAll("d" , d);  
        exp = exp.replaceAll("m1" , m1);  
        exp = exp.replaceAll("m2" , m2);  
        exp = exp.replaceAll("m3" , m3);  
          
        //执行表达式   
        FelEngine engine = new  FelEngineImpl();  
        int  result = ((Integer)engine.eval(exp)).intValue();  
          
        if (Math.abs(result -  24 ) <  0.1 ){  
            return  exp;  
        }else {  
            return   null ;  
        }  
    }  
      
    /**  
     * 取得能算得24的四位数字的集合  
     * @param count 数字组数  
     */   
    public   static  Set<String> genNumbers( int  count){  
        Set<String> set = new  HashSet<String>();  
          
        while ( true ){  
            StringBuffer sb = new  StringBuffer();  
              
            //随机生成四位数字   
            String[] n = new  String[ 4 ];  
            for ( int  i= 0 ;i<n.length;i++){  
                String s = String.valueOf(Math.round(Math.floor(Math.random() * 9 )) +  1 );  
                n[i] = s;  
                sb.append(s);  
            }  
              
            //计算   
            String result = execute(n);  
            if (result!= null  && !set.contains(sb.toString())){  
                set.add(sb.toString());  
                System.out.println(sb.toString() + " : "  + result);  
            }  
              
            if (set.size()==count)  break ;  
        }  
          
        return  set;  
    }  
      
    public   static   void  main(String[] args) {  
        Set<String> set = genNumbers(5 );  //随机生成5组能算出24的数字   
        System.out.println("ok" );  
    }  
}  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值