原创 24点算法收藏

 | 旧一篇: 大家帮忙找一个实习单位!无分可散!不好意思!

/* first函数给出各个运算符的优先级,其中=为表达式结束符 */
int first(char c)
{ int p;
switch(c)
{ case ‘*‘: p=2; break;
case ‘/‘: p=2; break;
case ‘+‘: p=1; break;
case ‘-‘: p=1; break;
case ‘(‘: p=0; break;
case ‘=‘: p=-1; break;
}
return(p);
}
/* 此函数实现中缀到后缀的转换 */
/* M的值宏定义为20 */
/* sp[]为表达式数组 */
int mid_last()
{ int i=0,j=0; char c,sm[M];
c=s[0]; sm[0]=‘=‘; top=0;
while(c!=‘\0‘)
{ if(islower(c)) sp[j++]=c;
else switch(c)
{ case ‘+‘:
case ‘-‘:
case ‘*‘:
case ‘/‘: while(first(c)<=first(sm[top]))
sp[j++]=sm[top--];
sm[++top]=c; break;
case ‘(‘: sm[++top]=c; break;
case ‘)‘: while(sm[top]!=‘(‘)
sp[j++]=sm[top--];
top--; break;
default :return(1);
}
c=s[++i];
}
while(top>0) sp[j++]=sm[top--];
sp[j]=‘\0‘; return(0);
}
/* 由后缀表达式来计算表达式的值 */
int calc()
{ int i=0,sm[M],tr; char c;
c=sp[0]; top=-1;
while(c!=‘\0‘)
{ if(islower(c)) sm[++top]=ver[c-‘a‘];/*在转换过程中用abcd等来代替数,
这样才可以更方便的处理非一位数,
ver数组中存放着这些字母所代替的数*/
else switch(c)
{ case ‘+‘: tr=sm[top--]; sm[top]+=tr; break;
case ‘-‘: tr=sm[top--]; sm[top]-=tr; break;
case ‘*‘: tr=sm[top--]; sm[top]*=tr; break;
case ‘/‘: tr=sm[top--];sm[top]/=tr;break;
default : return(1);
}
c=sp[++i];
}
if(top>0) return(1);
else { result=sm[top]; return(0); }
}


 

发表于 @ 2006年11月26日 13:45:00|评论(loading...)|编辑

 | 旧一篇: 大家帮忙找一个实习单位!无分可散!不好意思!

评论

#袁峰 发表于2006-11-26 15:32:00  IP: 71.112.97.*
哪要这样复杂啊?

不要 bottom-up 写程序
#赵婉如 发表于2006-11-28 20:23:00  IP: 218.21.47.*
那要怎样写啊?
#赵婉如 发表于2006-11-28 20:23:00  IP: 218.21.47.*
那要怎样写啊?
#赵婉如 发表于2006-11-28 20:23:00  IP: 218.21.47.*
那要怎样写啊?
#赵婉如 发表于2006-11-28 20:23:00  IP: 218.21.47.*
那要怎样写啊?
#赵婉如 发表于2006-11-28 20:24:00  IP: 218.21.47.*
那要怎样写啊?
#赵婉如 发表于2006-11-28 20:24:00  IP: 218.21.47.*
那要怎样写啊?
#iyaosan 发表于2007-01-03 16:20:16  IP: 59.61.96.*
# 袁峰 发表于2006-11-26 15:32:00 IP: 71.112.97.*
哪要这样复杂啊?

不要 bottom-up 写程序


袁峰高手来了也不说话
#iyaosan 发表于2007-01-03 16:22:03  IP: 59.61.96.*
关于24点算法的思想和代码实现C语言程序设计 /chimf 发表于2006-09-21 17:47
先简单介绍一下24点游戏:
给出4个1-9之间的自然数,其中每个数字只能使用一次;任意使用 + - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏。比如两道比较经典的题目:1,5,5,5和3,3,8,8,先自己试试,答案贴在文章最后^_^

此文所贴代码均为面向过程的C(++)代码,在VC6下编译通过。

解决这个问题一般使用穷举法,即穷举4个整数所有可能的表达式,然后对表达式求值。下面的两种思路(三种算法)均是基于穷举法,各有优劣。

第一种思路:
把多元运算转化为两元运算,先从四个数中取出两个数进行运算,然后把运算结果和第三个数进行运算,再把结果与第四个数进行运算。在求表达式的过程中,最难处理的就是对括号的处理,而这种思路很好的避免了对括号的处理。基于这种思路有两种算法:

第一种算法:
(1) 将4个整数放入数组中,
(2) 在数组中取两个数字的排列,共有 P(4,2) 种排列。对每一个排列,
(2.1) 对 + - * / 每一个运算符,
(2.1.1) 根据此排列的两个数字和运算符,计算结果,
(2.1.2) 改表数组:将此排列的两个数字从数组中去除掉,将 2.1.1 计算的结果放入数组中,
(2.1.3) 对新的数组,重复步骤 2,
(2.1.4) 恢复数组:将此排列的两个数字加入数组中,将 2.1.1 计算的结果从数组中去除掉。

可以看出,步骤2是一个递归函数。当数组中只剩下一个数字的时候,这就是表达式的最终结果,此时递归结束。

这个是程序代码,源代码为csdn 算法论坛前版主海星所作,我修改了部分变量。此程序只能求出第一个解,无法求出全解。

引用内容:
#include<iostream>
#include<string>
#include<cmath>

using namespace std;

const double PRECISION = 1E-6;
const int COUNT = 4;
const int RESULT = 24;

double number[COUNT]; //这里一定要用double,看看第一题的答案就知道为什么了
string expression[COUNT]; //保存表达式

bool Test(int n){
//递归结束
if(n==1){
if(fabs(number[0]-RESULT)<PRECISION){
cout<<expression[0]<<endl;
return true;
}
else
return false;
}<
#iyaosan 发表于2007-01-03 16:23:02  IP: 59.61.96.*
http://www.bloghome.cn/posts/49570

这里复制来的
#lidongri 发表于2007-02-27 17:19:16  IP: 124.129.77.*
不说别的
代码规范就应该搞搞
#xdspower 发表于2007-03-08 11:43:54  IP: unknown, 221.10.*
(5-1/5)*5=24

不过严格意义上的24点游戏中间过程的结果数也要求整数的啊
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © zhaowanru19