回 帖 发 新 帖 刷新版面

主题:[讨论]求24点算法

看别人做的24点挺爽的,自己想做,就是不知道算法,哪位高手指点一下.....

回复列表 (共51个回复)

41 楼

消重比较麻烦啊~~~

42 楼

[quote]我提个思路吧,就是找出所有的等价式:
a+b == b+a
a*b == b*a
就这两种。

比如 a+b+c*d 就等同于
a+c*d+b
b+a+c*d
b+c*d+a
c*d+a+b
c*d+b+a
a+b+d*c
a+d*c+b
b+a+d*c
b+d*c+a
d*c+a+b
d*c+b+a

所以只要根据 a+b == b+a 和 a*b == b*a 就可以剔除掉所有等价的算式
[/quote]
远远不止这么一点

43 楼

怎么是6个数呢?我玩过24点,是4个数字的啊

44 楼

一直都是四个数啊

45 楼

建议一个功能,把它扩展了,定义其它更多的运算符或函数,更多的运算数,做个完全24点。

46 楼

又被顶起来瞭...

47 楼

你有没有<VISUAL FOXPRO 信息管理系统开发> 这本书
他详细的介绍了如何实现你的要求
主要思想就是把日期分成若干块
现在没有那么多时间,要不给你写原代码
.....

48 楼


去除等效解 ,什么意思 ??

49 楼

初二已经用VB实现过,你们那的教学怎么这么先进的!
我到初三才第一次看到计算机 !!

50 楼


public class C24 {
    /**
     * @param args
     */
    public char ch(int i){
        char c = '?';
        switch(i){
        case 0 : c = '+';break;
        case 1 : c = '-';break;
        case 2 : c = '*';break;
        case 3 : c = '/';break;
        }
        return c;
    }
    public double m(double result,int n,int num){
        switch(n){
        case 0 : result+=num;break;
        case 1 : result-=num;break;
        case 2 : result*=num;break;
        case 3 : result/=num;break;
        }
        return result;
    }
    
    public void cal(int a,int b,int c,int d){
        int [] num = new int[]{a,b,c,d};
        for(int i=0;i<num.length;++i){
            if(num[i]<1||num[i]>13){
                System.out.println("输入的数字应在1~13之间");
                return;
            }
        }
        double result = 0;
        for(int i=0;i<num.length;++i){
            for(int j=0;j<num.length;++j){
                if(j==i)continue;
                for(int m=0;m<num.length;++m){
                    if(m==i||m==j)continue;
                    for(int n=0;n<num.length;++n){
                        if(n==i||n==j||n==m)continue;
                        result = num[i];
                        for(int ii=0;ii<4;++ii){
                            double r1 = result;
                            result = m(result,ii,num[j]);
                            for(int jj=0;jj<4;++jj){
                                double r2 = result;
                                result = m(result,jj,num[m]);
                                for(int mm=0;mm<4;++mm){
                                    double r3 = result;
                                    result = m(result,mm,num[n]);
                                    if(result==24){
                                        System.out.println("(("+num[i]+ch(ii)+num[j]+")"+ch(jj)+num[m]+")"+ch(mm)+num[n]+"="+result);
                                        return;
                                    }
                                    result = r3;
                                }
                                result = r2;
                            }
                            result = r1;
                        }
                    }
                }
            }
        }
        if(result!=24){
            System.out.println("无法算出24");
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
            new C24().cal(2,2,85,5);
            new C24().cal(2,2,2,3);
            new C24().cal(1,2,10,5);
            new C24().cal(2,7,6,5);
            new C24().cal(3,2,4,5);
            new C24().cal(5,2,12,5);
            new C24().cal(8,4,3,2);
            new C24().cal(10,8,11,2);
            new C24().cal(7,7,4,4);
    }
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册