主题:[讨论]求24点算法
stroyer
[专家分:70] 发布于 2007-03-10 20:56:00
看别人做的24点挺爽的,自己想做,就是不知道算法,哪位高手指点一下.....
回复列表 (共51个回复)
41 楼
stroyer [专家分:70] 发布于 2007-04-20 16:07:00
消重比较麻烦啊~~~
42 楼
雨中飞燕 [专家分:18980] 发布于 2007-04-20 16:36:00
[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 楼
小小C [专家分:4570] 发布于 2007-04-20 17:33:00
怎么是6个数呢?我玩过24点,是4个数字的啊
44 楼
雨中飞燕 [专家分:18980] 发布于 2007-04-20 17:43:00
一直都是四个数啊
45 楼
Rick0ne [专家分:1490] 发布于 2007-04-20 20:55:00
建议一个功能,把它扩展了,定义其它更多的运算符或函数,更多的运算数,做个完全24点。
46 楼
bpttc [专家分:8790] 发布于 2007-04-20 20:57:00
又被顶起来瞭...
47 楼
030106026 [专家分:70] 发布于 2007-05-14 22:40:00
你有没有<VISUAL FOXPRO 信息管理系统开发> 这本书
他详细的介绍了如何实现你的要求
主要思想就是把日期分成若干块
现在没有那么多时间,要不给你写原代码
.....
48 楼
vfdff [专家分:740] 发布于 2007-07-28 10:22:00
去除等效解 ,什么意思 ??
49 楼
vfdff [专家分:740] 发布于 2007-07-28 10:27:00
初二已经用VB实现过,你们那的教学怎么这么先进的!
我到初三才第一次看到计算机 !!
50 楼
binbin1230 [专家分:0] 发布于 2008-03-01 14:42:00
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);
}
}
我来回复