可以参考我的百度空间里的24点程序:
http://hi.baidu.com/zmjdx/blog/item/65fe6882dc2ac2a30df4d20d.html#include <iostream>
#include <time.h>
using namespace std;
typedef unsigned char byte;
bool compute(byte op[]);
bool GetNextArrange(byte flag[]);
void main(){
srand((long)time(NULL));
byte points[4],oper[4];
cout<<"随机产生四个1-13的数:"<<endl;
for(int i=0;i<4;i++){
points[i] = (byte)(1 + rand() % 13);
cout<<(int)points[i]<<" ";
}
cout<<endl<<"---------------------------------------"<<endl;
//oper数组存放加减乘除 为了与数区分 编号成大于16的数
for (i=0;i<4;i++)
oper[i] = 1 << (i+4);
//分三步走:
//1从数字中抽两个
//2从运算符中抽三个
//3剩下的两个数和三个运算符做全排列 加上1步中的两个数(放最前),这0七个因子构成逆波兰式,计算即可
//逆波兰数组 rpn(Reverse Polish Notation)
byte rpn[7];
for(i=0;i<4;i++){
rpn[0] = points[i];
for(int j=i+1;j<4;j++){//取两个数points[i],points[j]
rpn[1] = points[j];
for(int k=0;k<4;k++){//取一个运算符(即取了剩下的三个)
int m = 2; //逆波兰数组里已经保存有两个数,下一个数下标从2开始
for(int l=0;l<4;l++){
if(l != i && l != j)
rpn[m++] = points[l];
if(l != k)
rpn[m++] = oper[l];
}
//逆波兰中的七个数(包含运算符)都已经填完,但后面的五个可以换序
compute(rpn);
byte array[5];
for(int n=0;n<5;n++)
array[n] = rpn[n+2];
byte flag[5] = {1,2,3,4,5};
while(GetNextArrange(flag)){
for(int i=0;i<5;i++)
rpn[i+2] = array[flag[i] - 1];
compute(rpn);
}
}
}
}
}
bool compute(byte op[]){
double result = 0;
double copy[4] = {0,0,0,0};
int pos = -1;
for(int i=0;i<7;i++){
if(op[i] < 16){
pos++;
copy[pos] = op[i];
if(pos > 3) //太多操作数
return false;
}
else{//是运算符
if(pos < 1){//不足两个数,不能运算!
return false;
}
switch(op[i]){
case 1<<4: // +
result = copy[pos-1] + copy[pos];
break;
case 1<<5: // -
result = copy[pos-1] - copy[pos];
break;
case 1<<6: // *
result = copy[pos-1] * copy[pos];
break;
case 1<<7: // /
if(copy[pos] == 0)
return false;
result = (double)copy[pos-1] / copy[pos];
break;
default:
break;
}
pos--;
copy[pos] = result;
}
}
if(pos == 0 && result == 24){
for(int k=0;k<7;k++){
if(op[k]<15)
cout<<(int)op[k]<<" ";
else
switch(op[k]) {
case 1<<4:
cout<<"+ ";
break;
case 1<<5:
cout<<"- ";
break;
case 1<<6:
cout<<"* ";
break;
case 1<<7:
cout<<"/ ";
break;
default:
break;
}
}
cout<<endl;
return true;
}
else
return false;
}
void wrap(byte *a,byte *b){
byte temp = *a;
*a = *b;
*b = temp;
}
void sort(byte *p,int n){
for(int i=n-1;i>=0;i--)
for(int j=0;j<i;j++){
if(p[j] > p[j+1])
wrap(&p[j],&p[j+1]);
}
}
//求下一个全排列,所有排列完成后返回false
bool GetNextArrange(byte flag[]){
bool ret = false;
byte *min;
int deta = 5;
for(int i=4;i>0;i--){
if(flag[i] > flag[i-1]){
for(int j=i;j<5;j++){
if(flag[j] > flag[i-1]){
if((flag[j] - flag[i-1]) < deta){
deta = flag[j] - flag[i-1];
min = &flag[j];
}
}
}
wrap(min,&flag[i-1]);
sort(&flag[i],5-i);
ret = true;
break;
}
}
return ret;
}