回 帖 发 新 帖 刷新版面

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

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

回复列表 (共51个回复)

31 楼

以前有人用递归的方式实现了 ,但是程序我没有看懂

32 楼

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

const double PRECISION = 1E-6;
const int COUNT_OF_NUMBER  = 4;
const int NUMBER_TO_CAL = 24;
int nCount=0;
double number[COUNT_OF_NUMBER];
string expression[COUNT_OF_NUMBER];

void Search(int n)
{
    if (n == 1)if ( fabs(number[0] - NUMBER_TO_CAL) < PRECISION )
    {
        cout << expression[0] << endl; nCount++;
        return;
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            double a, b;
            string expa=expression[i],expb=expression[j];
            a = number[i];b = number[j];number[j] = number[n - 1];
            expression[j] = expression[n - 1];
            expression[i]='('+expa+'+'+expb+')';number[i]=a+b;Search(n-1);
            expression[i]='('+expa+'-'+expb+')';number[i]=a-b;Search(n-1);
            expression[i]='('+expb+'-'+expa+')';number[i]=b-a;Search(n-1);
            expression[i]='('+expa+'*'+expb+')';number[i]=a*b;Search(n-1);
            if (b != 0)expression[i]='('+expa+'/'+expb+')';number[i]=a/b;
            if (a != 0)expression[i]='('+expb+'/'+expa+')';number[i]=b/a;
            number[i]=a;number[j]=b;expression[i]=expa;expression[j]=expb;
        }
    }
    return;

void main()
{
    nCount=0;
    for (int i = 0,x; i < COUNT_OF_NUMBER; i++)
    {
        char buffer[20];
        cout<<"Input num "<<i+1<<":";
        cin >> x;
        number[i] = x;
        itoa(x, buffer, 10);
        expression[i] = buffer;
    }
    Search(COUNT_OF_NUMBER);cout <<"Total answer = "<< nCount << endl;
}
这个代码就正如楼上,是用的递归,原程序出自CSDN前版主(名字偶忘记了,sorry)
以上是偶修改过的程序

33 楼

完全去除冗余解的C程序偶已经写出来了,等偶改写在MFC窗口界面以后就发给大家看看

34 楼

24点的方法还是很多的。上次偶想了一种方法,要分两种情况考虑,写起来也只要一个递归就可以了(基本思想是将等式倒着算)。但有一个缺点,这种方法不好扩展(如果参与运算的数字不止4个数的话,情况会一下子增加许多)
后面看到了 starfish 大牛的方法(也就是26楼的转贴),才发现他的方法会更系统。一直以来想用他的算法实现一下,但都因懒而没做 - -~~~
冒个泡 Orz 一下 starfish 大牛

35 楼

过滤写的很吐血

36 楼

飞燕已经做出来了,不过没给我源代码~~

37 楼

唉。。。。。被某某人抓了NN个bug出来了。。。。。。。

38 楼

呵呵,不会吧,还有某某人呀

39 楼

现在都改好了貌似。。。。。
不过楼上的更厉害。。。。。

40 楼

我提个思路吧,就是找出所有的等价式:
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 就可以剔除掉所有等价的算式

我来回复

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