计算24点的程序讨论,欢迎大家进来解决方案

计算24点的程序讨论,欢迎大家进来
http://club.it.sohu.com/read_art_sub.new.php?b=program&a=73842&sr=0&allchildnum=1&t=0&NoCache=1

欢迎大家发表看法,谢谢帮顶,会给分的

------解决方案--------------------
4个数算24不难,难在2处
1:去除所有重复,简单点是只去满足交换律的,复杂点要去除满足运算符翻转的。
2:推广到N个数算X
------解决方案--------------------
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

typedef float (*PF)(float, float);
char *ch[]={NULL, "A ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ", "9 ", "10 ", "J ", "Q ", "K "};
char cc[]= "+-*/ ";
//int rand_seed = 0;

void rand_num(int *num)
{
int i;
// srand(num[(rand_seed++)%4]);
for(i=0; i <4; i++)
num[i] = rand()%12 +1;
}

float add(float x, float y)
{
return x+y;
}

float sub(float x, float y)
{
return x-y;
}

float mul(float x, float y)
{
return x*y;
}

float divide(float x, float y)
{
if((y> -0.0000001)&&(y <0.0000001))
return 0;
else return x/y;
}


/*The compute function!*/
void compute_24(int num[])
{
PF pf[4]={add,sub,mul,divide};
int i,j,k,x,y,z,t;
int flag=0,flag_i=0, flag_j=0, flag_equ_end2=0;
float op_x, op_y, op_z;

/*Kind 1*/
for(i=0; i <4; i++) /*num[i] is the first para*/
{
for(t=0; t <i; t++)
if(num[t] == num[i])
flag_i = 1;
if(flag_i)
{
flag_i=0;
continue;
}

for(j=0; j <4; j++) /*num[j] is the 2nd para*/
{
if(j == i)
continue;

for(t=j-1; t> 0; t--)
if((num[j] == num[t])&&(num[i]!=num[t]))
flag_j = 1;
if(flag_j)
{
flag_j=0;
continue;
}

for(x=0; x <4; x++) /*pf[x] is the 1st operation*/
{
if((j <i)&&
((x==0)||(x==2))
)
continue;

op_x = pf[x]((float)num[i],(float)num[j]);
for(k=0; k <4; k++) /*num[k] is the 3rd para, and the last is num[6-i-j-k]*/
{
if(k==i || k==j)
continue;

if(num[k] == num[6-i-j-k])
flag_equ_end2 = 1;

for(y=0; y <4; y++) /*pf[y] is the 2nd operation*/
{
if( (k <j)&&
(((x <2)&&(y <2)) ||
((x> 1)&&(y> 1)))
)
continue;

op_y = pf[y](op_x, (float)num[k]);
for(z=0; z <4; z++) /*pf[z] is the 3rd operation*/
{
if((x==y)&&(x==z)&&((i!=0)||(j!=1)||(k!=2)))
continue;

if( (((z <2)&&(y <2)) ||
((z> 1)&&(y> 1))) &&
(k> (6-i-j-k))
)
continue;