突然接触24点游戏,突发奇想,是否可以全排列方式来进行计算,首先,建立一个类
class S_24_C
{
public:
#define Max_Num (4*3*2)
//#define Max_Num1 (4*4*4*4)
S_24_C();
unsigned char sour_num[4];
unsigned char sour_num_order;//填入sour_num的下标
unsigned char order_date[Max_Num][4];
unsigned char result_date[4] = {24,24,24,24};
unsigned char fuhao_date[4] = {0,0,0,0};
//unsigned char yunsuan_date[Max_Num1][4];
enum
{
no_err,
reduce_err,//减法错误
chu_err,//除法法错误
}error_code;
void set_sour_num(unsigned char num);
void clr_sour_num();
void paixu_2(unsigned char *num1,unsigned char *num2);//两个数排序
void paixu_3(unsigned char *num,unsigned char flag);
void paixu_4(unsigned char (*dest)[4], unsigned char *num,unsigned char flag);
void fill_yunsuan(unsigned char dest[][3], unsigned char *num,unsigned char flag);
unsigned int cal(unsigned int num,unsigned int num1,unsigned char flag);
void start_c(const unsigned char* num);//进行计算
unsigned int add (unsigned int a,unsigned int b);//加运算
unsigned int reduce (unsigned int a,unsigned int b);//减运算
unsigned int cheng (unsigned int a,unsigned int b);//乘法运算
unsigned int chu (unsigned int a,unsigned int b);//除法运算
void memcpy(unsigned char *dest,unsigned char*sour,unsigned int length);
private:
};
全排列的方式为,先做两个数的排列,有两种情况,本质为两个数交换
void S_24_C::paixu_2(unsigned char *num1,unsigned char *num2)
{
unsigned char temp;
temp = num1[0];
num1[0] = num2[0];
num2[0] = temp;
}
三个数全排列
void S_24_C::paixu_3(unsigned char *num,unsigned char flag)
{
unsigned char temp;
if(0 == flag)
{
}
else if(1 == flag)
{
paixu_2(&num[1],&num[2]);
}
else if(2 == flag)
{
paixu_2(&num[0],&num[1]);
paixu_2(&num[0],&num[2]);
}
else if(3 == flag)
{
paixu_2(&num[1],&num[2]);
}
else if(4 == flag)
{
paixu_2(&num[0],&num[1]);
paixu_2(&num[0],&num[1]);
}
else if(5 == flag)
{
paixu_2(&num[1],&num[2]);
}
}
四个数的全排列,将一个序列的首字符与其他位对换,使用三个排列的函数进行排列,将所得的序列考入到一个二维数组中。
void S_24_C::paixu_4(unsigned char (*dest)[4], unsigned char *num,unsigned char flag)
{
unsigned char temp;
unsigned char i = 0,k = 0,a =0;
unsigned int j = 0;
unsigned char buffer[4];
for(k = 0;k<4;k++)
{
//此处对buffeer重新赋值
memcpy(buffer,num,4);
if(k)
paixu_2(&buffer[0],&buffer[k]);
#if 1
for(i = 0;i<6;i++)
{
paixu_3((buffer+1),i);
#if 0
for(a = 0;a< 4;a++)
{
order_date[j][a] = buffer[a];
}
j++;
#endif
memcpy((unsigned char*)dest[j++],buffer,4);
}
#endif
}
}
同时也要将各种计算的加减乘除各种排列排列出来,1代表加,2代表减,3代表乘,4代表除法,排列
void S_24_C::fill_yunsuan(unsigned char dest[][3], unsigned char *num,unsigned char flag)
{
unsigned char temp;
unsigned char i = 0,j = 0,k = 0,a = 0;
unsigned int b = 0;
unsigned char buffer[3];
for(a = 0;a <4;a++)
{
buffer[0] = num[a];
for(k = 0;k < 4;k++)
{
buffer[1] = num[k];
for(j = 0;j <4;j++)
{
buffer[2] = num[j];
memcpy(dest[b++],buffer,3);
}
}
}
}
然后将数值和运算符号进行组合,将加减,乘除使用函数包装为了防止减,出现负数,和除法,有余数,导致计算失误,
unsigned int S_24_C::cal(unsigned int num,unsigned int num1,unsigned char flag)
{
unsigned char i;
unsigned int result;
#if 1
if(1 == flag)
result = add(num,num1);
else if(2 == flag)
result = reduce(num,num1);
else if(3 == flag)
result = cheng(num,num1);
else if(4 == flag)
result = chu(num,num1);
#endif
return result;
}
进行运算
unsigned int S_24_C::cal(unsigned int num,unsigned int num1,unsigned char flag)
{
unsigned char i;
unsigned int result;
#if 1
if(1 == flag)
result = add(num,num1);
else if(2 == flag)
result = reduce(num,num1);
else if(3 == flag)
result = cheng(num,num1);
else if(4 == flag)
result = chu(num,num1);
#endif
return result;
}
void S_24_C::start_c(const unsigned char* num)//进行计算
{
unsigned char i,x,y,a,b;
unsigned char source_date[4];
unsigned int j = 0,k = 0;
unsigned char yun[4] = {1,2,3,4};//1代表加,2代表减,3乘法
unsigned int result = 0;
unsigned int result_1 = 0;
#if 0
for(i = 0;i<sizeof(order_date);i++)
{
*((unsigned char*)order_date+i) = 0;//清除数据
}
#endif
for(i = 0;i<sizeof(source_date);i++)
{
source_date[i] = num[i];//复制数据
}
paixu_4(order_date,source_date,0);//24种情况已经计算好,存储在order_date yunsuan_date
fill_yunsuan(&yunsuan_date[0],yun,0);
#if 1
error_code = no_err;
for(k = 0;k<Max_Num;k++)
{
for(j = 0;j< Max_Num1;j++)
{
qDebug( "order %d,%d,%d,%d", order_date[k][0],order_date[k][1],order_date[k][2],order_date[k][3]);
qDebug( "yunsuan %d,%d,%d",yunsuan_date[j][0],yunsuan_date[j][1],yunsuan_date[j][2] );
if(!error_code)
{
result =cal(order_date[k][0],order_date[k][1],yunsuan_date[j][0]);
}
if(!error_code)
{
result =cal(result,order_date[k][2],yunsuan_date[j][1]);
}
if(!error_code)
{
result =cal(result,order_date[k][3],yunsuan_date[j][2]);
}
qDebug( "result %d",result );
qDebug( "------------------------------------------------");
if((24 == result)&&(!error_code))
{
sour_num_order = 10;
memcpy(result_date,order_date[k],4);
memcpy(fuhao_date,yunsuan_date[j],3);
return ;
}
else
{
error_code = no_err;
}
qDebug( "order %d,%d,%d,%d", order_date[k][0],order_date[k][1],order_date[k][2],order_date[k][3]);
qDebug( "yunsuan %d,%d,%d",yunsuan_date[j][0],yunsuan_date[j][1],yunsuan_date[j][2] );
if(!error_code)
{
result =cal(order_date[k][0],order_date[k][1],yunsuan_date[j][0]);
}
if(!error_code)
{
result_1 =cal(order_date[k][2],order_date[k][3],yunsuan_date[j][2]);
}
if(!error_code)
{
result =cal(result,result_1,yunsuan_date[j][1]);
}
qDebug( "result %d",result );
qDebug( "------------------------------------------------");
if((24 == result)&&(!error_code))
{
sour_num_order = 11;
memcpy(result_date,order_date[k],4);
memcpy(fuhao_date,yunsuan_date[j],3);
return ;
}
else
{
error_code = no_err;
}
}
}
#endif
}
运行截图
以上数字输入使用按钮控件,数字结果使用label控件,
程序编译后打包使用命令行windeployqt打包程序,解决依赖关系,以上在widow下编译运行