http://www.prcer.com/tools/24/24-1.html (经检验,不含病毒!)
这是原游戏网址,该算法速度相当快,求解相当全面.

解决方案 »

  1.   

    是啊,相见恨晚,可惜不懂javascript啊,楼上的兄弟能翻翻不?
      

  2.   

    我对 javascript 很熟悉,但不知道什么是 24点算法 ,要是你能简单介绍下 ,我给你翻译是不成问题的。
      

  3.   

    我再发一个值得收藏的,呵呵。<script>
    function get24(n1,n2,n3,n4){
    (s=String.prototype).r=s.replace;q:for(i in a=[n1,n2,n3,n4])for(j in a)for(k in a)for(l in a)if(i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l)for(m in b=["(x+y)","(x-y)","(x*y)","(x/y)","(y-x)","(y/x)"])for(n in b)for(o in b)if((d=Math.abs)(eval(s=b[o].r(x="x",b[n].r(x,p=b[m].r(x,a[i]).r(y="y",a[j])).r(y,g=a[k])).r(y,h=a[l]))-24)<0.01||d(eval(s=b[n].r(x,p).r(y,b[o].r(x,g).r(y,h)))-24)<0.01){alert(s+"=24");break q;}
    }
    get24(8,2,4,6);
    </script>
      

  4.   


    function get24(n1,n2,n3,n4){ 
    (s=String.prototype).r=s.replace;
    q:for(i in a=[n1,n2,n3,n4])
    for(j in a)
    for(k in a)
    for(l in a)
    if(i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l)
    for(m in b=["(x+y)","(x-y)","(x*y)","(x/y)","(y-x)","(y/x)"])
    for(n in b)
    for(o in b)
    if((d=Math.abs)(eval(s=b[o].r(x="x",b[n].r(x,p=b[m].r(x,a[i]).r(y="y",a[j])).r(y,g=a[k])).r(y,h=a[l]))-24) <0.01||d(eval(s=b[n].r(x,p).r(y,b[o].r(x,g).r(y,h)))-24) <0.01)
    {alert(s+"=24");break q;} 
    } 穷举啊,楼主给的是显示所有结果,要是穷举…………
      

  5.   


    #include <iostream>
    #include <cstdlib>
    #include <string>
    #include <time.h>
    #include <algorithm>
    #include <cstring>
    #include <Stack>
    #include <cmath>
    using namespace std;
    const int squeezer[]={1,2,3,4,5,6,7,8,9,10,11,12,13,
                          1,2,3,4,5,6,7,8,9,10,11,12,13,
                          1,2,3,4,5,6,7,8,9,10,11,12,13,
                          1,2,3,4,5,6,7,8,9,10,11,12,13};
    const char operate[]={'+','-','*','/'};
    string total[10000];
    class num{
        public:
            double val;
            string s;
            bool sign;
    } OperateNumA[4],OperateNumB[4];
    bool IsFind;
    int count_num;
    stack<long double>s2;int icp(char ch)
    {
    if (ch>='a'&&ch<='i') return 8;
    else if(ch=='^') return 6;
    else if (ch=='*'||ch=='/') return 4;
    else if (ch=='+'||ch=='-') return 2;
    else if(ch==')') return 1;
    else if(ch=='(') return 10;
    else return 0;
    }
    int isp(char ch)
    {
    if (ch>='a'&&ch<='i') return 9;
    else if(ch=='^') return 7;
    else if (ch=='*'||ch=='/') return 5;
    else if (ch=='+'||ch=='-') return 3;
    else if(ch==')') return 10;
    else if(ch=='(') return 1;
    else return 0;
    }
    bool isnum(char ch)
    {
    if (ch>='0' &&ch<='9') return 1;
    return 0;
    }void GetOperands(long double&op1,long double&op2)
    {
    op1=s2.top();
    s2.pop();
    op2=s2.top();
    s2.pop();
    }
    void DoOperator(char oper)
    {
    long double oper1,oper2;
    GetOperands(oper1,oper2);
    switch(oper)
    {
    case '+':s2.push(oper2+oper1);break;
    case '-':s2.push(oper2-oper1);break;
    case '*':s2.push(oper2*oper1);break;
    case '/':s2.push(oper2/oper1);break;
    }
    }
    void run(char t1[][10],int count)
    {
    if (t1[count][1]!='#')
    {
    long double temp2;
    switch(t1[count][1])
    {
    case '+':
    case '-':
    case '*':
    case '/':DoOperator(t1[count][1]);break;
    default:temp2=atof(t1[count]);s2.push(temp2);break;
    }
    }
    }
    long double f(string s)
    {
    char temp[10];
    memset(temp,0,sizeof(temp));
    stack<char> s1;
    s1.push('#');
    int count(-1),i(0),flag(1);
    char t1[100][10],y;
    memset(t1,0,sizeof(t1));
    while (i!=s.size())
    {
    if (isnum(s[i])||(s[i]=='-'&&!isnum(s[i-1])&&isnum(s[i+1]))) 
    {
    string tmp=s.substr(i,s.size());
    long double t=atof(tmp.data());
    count++;
                gcvt(t,8,t1[count]);
    i++;
    for (;isnum(s[i])||s[i]=='.';i++);
    flag=0;
    run(t1,count);
    }
    else if(s[i]==')')
    for (y=s1.top(),s1.pop();y!='(';y=s1.top(),s1.pop())
    {
    count++;
    t1[count][1]=y;
    run(t1,count);
    }
    else{
    for (y=s1.top(),s1.pop();icp(s[i])<isp(y);y=s1.top(),s1.pop())
    {
    count++;
    t1[count][1]=y;
    run(t1,count);
    }
    s1.push(y);
    s1.push(s[i]);
    }
    if (flag) i++;
    else flag=1;
    }
    while (!s1.empty())
    {
    count++;
    t1[count][1]=s1.top();
    s1.pop();
    run(t1,count);
    }
    return s2.top();
    }
    void dfs(int dep)
    {
        int i,j,l;
        for (i=0;i<4;i++)
            for (j=0;j<4;j++)
            {
                if (i!=j&&!OperateNumA[i].sign&&!OperateNumB[j].sign)
                {
                    for (l=0;l<4;l++)
                    {
                        if (l==1&&(OperateNumA[i].val<OperateNumB[j].val)) continue;
                        double tmp=OperateNumA[i].val;
                        switch(l)
                        {
                            case 0:OperateNumA[i].val+=OperateNumB[j].val;break;
                            case 1:OperateNumA[i].val-=OperateNumB[j].val;break;
                            case 2:OperateNumA[i].val*=OperateNumB[j].val;break;
                            case 3:OperateNumA[i].val/=OperateNumB[j].val;break;
                        }
                        OperateNumB[j].sign=1;
    OperateNumA[j].sign=1;
                        string temp=OperateNumA[i].s;
                        OperateNumA[i].s+=operate[l];
                        OperateNumA[i].s+=OperateNumB[j].s;
    OperateNumB[i]=OperateNumA[i];
    double mistake=OperateNumA[i].val-24.0;
    int result=int(OperateNumA[i].val);
                        if (dep!=1)
                        {
                            OperateNumA[i].s.insert(0,"(");
                            OperateNumA[i].s+=")";
    OperateNumB[i]=OperateNumA[i];
                            dfs(dep-1);
                        }
                        else if (!(mistake>0)&&(result==24))
                        {
                            total[count_num++]=OperateNumA[i].s;
                        } 
                        OperateNumB[j].sign=0;
    OperateNumA[j].sign=0;
                        OperateNumA[i].s=temp;
                        OperateNumA[i].val=tmp;
    OperateNumB[i]=OperateNumA[i];
                    }
                }
            }
    }
    int main()
    {
    while(count_num<=0)
    {
    srand(time(0));
        for (int i=0;i<4;i++)
        {
                OperateNumA[i].val=0;
                OperateNumA[i].s="";
                OperateNumA[i].sign=0;
        OperateNumB[i].val=0;
                OperateNumB[i].s="";
                OperateNumB[i].sign=0;
            }
    for (int k=0;k<4;k++)
    {
    OperateNumA[k].val=OperateNumB[k].val=squeezer[rand()%52];
    if (OperateNumA[k].val>9) OperateNumA[k].s=OperateNumB[k].s=char(int(OperateNumA[k].val)+55);
    else OperateNumA[k].s=OperateNumB[k].s=char(int(OperateNumA[k].val)+48);
    }
    count_num=0;
    dfs(3);
    }
    cout<<"电脑给出的四个数为:"<<endl;
    cout<<OperateNumA[0].val<<' '<<OperateNumA[1].val<<' '<<OperateNumA[2].val<<' '<<OperateNumA[3].val<<endl;
    cout<<"请给出你的正确答案:"<<endl;
    string s;
    cin>>s;
    long double fm,mis;
        fm=f(s);
    mis=fm-24.0;
    int result2=int(fm);
    if (!(mis>0)&&result2==24) cout<<"正确"<<endl;
        else 
    {
    cout<<"错误"<<endl;
    cout<<"请看正确答案"<<endl;
    sort(total,total+count_num);
    string pre="";
    for (int loop=0;loop<count_num;loop++)
    {
    if (total[loop]!=pre)
    {
    int len=total[loop].size();
    for (int l1=0;l1<len;l1++)
    {
    if (total[loop][l1]>='A'&&total[loop][l1]<='D')
    cout<<int(total[loop][l1])-55;
    else cout<<total[loop][l1];
    }
    cout<<endl;
    pre=total[loop];
    }
    }
    }
    system("pause");
        return 0;
    } 这是我用C++写的24点..主要用到了表达式计算和DFS..
    没做界面..在命令行下的.
      

  6.   

    我也写过一个比较简单的
    #include<iostream>
    #include<vector>
    #include<cmath>
    using namespace std;
    double calculate ( int m, double first, double second)
    {
        double result;
        switch(m)
        {
            case 0:
               result = first + second;
               break;
            case 1:
               result = first - second;
               break;
            case 2:
               result = first * second;
               break;
            case 3:
               result = first / second;
               break;
        }
        return result;
    }void print( int i, int j, int k,const  vector<double> &a )
    {
        char d, b, c;
        switch (i)
        {
            case 0:
               b = '+';
               break;
            case 1:
               b = '-';
               break;
            case 2:
               b = '*';
               break;
            case 3:
              b = '/';
               break;
        }
            switch (j)
        {
            case 0:
               c = '+';
               break;
            case 1:
               c = '-';
               break;
            case 2:
               c = '*';
               break;
            case 3:
              c = '/';
               break;
        }
            switch (k)
        {
            case 0:
               d = '+';
               break;
            case 1:
               d = '-';
               break;
            case 2:
               d = '*';
               break;
            case 3:
              d = '/';
               break;
        }
        cout <<"(("<< a[0] << d << a[1] <<')'<< c << a[2] << ")"<< b << a[3] << endl;
    }double fn ( const vector <double> &a )
    {
        double first;
        for ( int i = 0; i <= 3; i++ )
        {
            for ( int j = 0; j <= 3; j++ )
            {
               for ( int k = 0; k <= 3; k++ )
               {
                 first = calculate( i, calculate ( j , calculate(k, a[0],a[1]), a[2]),a[3]);
                 if ( abs(first - 24) < 0.0000001  )
                    print( i,j,k,a );
                }
            }
        }
    }
    int main()
    {
       vector <double> a;
       double c;
       for ( int i = 0; i < 4; i++ )
       {
           cout << "请输入第 " << i + 1 << "个数" <<endl;
           cin >> c;
           a.push_back(c);
       }   sort(a.begin(), a.end());
           fn ( a );   while ( next_permutation ( a.begin(), a.end()))
           fn ( a );   system("pause");
       return 0;}
      

  7.   

    不错
    海浪的这算法好啊
    MARK