主题:[讨论]求24点算法
stroyer
[专家分:70] 发布于 2007-03-10 20:56:00
看别人做的24点挺爽的,自己想做,就是不知道算法,哪位高手指点一下.....
回复列表 (共51个回复)
31 楼
vfdff [专家分:740] 发布于 2007-03-13 14:43:00
以前有人用递归的方式实现了 ,但是程序我没有看懂
32 楼
雨中飞燕 [专家分:18980] 发布于 2007-03-13 20:35:00
#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 楼
雨中飞燕 [专家分:18980] 发布于 2007-03-14 12:57:00
完全去除冗余解的C程序偶已经写出来了,等偶改写在MFC窗口界面以后就发给大家看看
34 楼
renew [专家分:200] 发布于 2007-03-14 16:26:00
24点的方法还是很多的。上次偶想了一种方法,要分两种情况考虑,写起来也只要一个递归就可以了(基本思想是将等式倒着算)。但有一个缺点,这种方法不好扩展(如果参与运算的数字不止4个数的话,情况会一下子增加许多)
后面看到了 starfish 大牛的方法(也就是26楼的转贴),才发现他的方法会更系统。一直以来想用他的算法实现一下,但都因懒而没做 - -~~~
冒个泡 Orz 一下 starfish 大牛
35 楼
forjane [专家分:5670] 发布于 2007-03-17 07:28:00
过滤写的很吐血
36 楼
rickone [专家分:15390] 发布于 2007-03-17 10:24:00
飞燕已经做出来了,不过没给我源代码~~
37 楼
雨中飞燕 [专家分:18980] 发布于 2007-03-17 23:53:00
唉。。。。。被某某人抓了NN个bug出来了。。。。。。。
38 楼
wangfangbob [专家分:380] 发布于 2007-03-19 00:38:00
呵呵,不会吧,还有某某人呀
39 楼
雨中飞燕 [专家分:18980] 发布于 2007-03-19 15:00:00
现在都改好了貌似。。。。。
不过楼上的更厉害。。。。。
40 楼
bruceteen [专家分:42660] 发布于 2007-03-19 17:53:00
我提个思路吧,就是找出所有的等价式:
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 就可以剔除掉所有等价的算式
我来回复