主题:[讨论]24点全解搞定
以下是我写的24点问题的算法,恳请指教!
Uc :hqsatnet
#include <stdio.h>
#include <math.h>
int num[4];
int numlow[24][4] ={0,1,2,3, /* 1****** numlow为num下标 ****/
0,2,1,3, /* 2*/
1,0,2,3, /* 3*/
1,2,0,3, /* 4*/
2,0,1,3, /* 5*/
2,1,0,3, /* 6*/
0,1,3,2, /* 7*/
0,2,3,1, /* 8*/
1,0,3,2, /* 9*/
1,2,3,0, /* 10*/
2,0,3,1, /* 11*/
2,1,3,0, /* 12*/
0,3,1,2, /* 13*/
0,3,2,1, /* 14*/
1,3,0,2, /* 15*/
1,3,2,0, /* 16*/
2,3,0,1, /* 17*/
2,3,1,0, /* 18*/
3,0,1,2, /* 19*/
3,0,2,1, /* 20*/
3,1,0,2, /* 21*/
3,1,2,0, /* 22*/
3,2,0,1, /* 23*/
3,2,1,0}; /* 24*/
main()
{
float calculate (float num1,float num2,int n);
char sign (int n);
loop:
scanf("%d%d%d%d",&num[0],&num[1],&num[2],&num[3]);
/***** 计算 ******/
for (int m=0;m<24;m++) /***** 遍历所有排列 *****/
{
for (int k=1;k<7;k++) /******* 遍历所有运算方式 *******/
{
for (int j=1;j<7;j++) /******* 遍历所有运算方式 *******/
{
for (int i=1;i<7;i++) /******* 遍历所有运算方式 *******/
{
if(fabs(calculate (calculate (calculate ( /****** 计算 ((A★B)★C)★D 类型***/
float(num[numlow[m][0]]),float(num[numlow[m][1]]),i)
,float(num[numlow[m][2]]),j)
,float(num[numlow[m][3]]),k) - 24)<0.01)
printf ("((%d %c %d) %c %d) %c %d\n",num[numlow[m][0]],sign (i),num[numlow[m][1]],sign (j),num[numlow[m][2]],sign (k),num[numlow[m][3]]);
if(fabs(calculate ( /**** 计算 (A★B)★(C★D) 类型******/
calculate (float(num[numlow[m][0]]),float(num[numlow[m][1]]),i)
,calculate (float(num[numlow[m][2]]),float(num[numlow[m][3]]),j)
,k) - 24)<0.01)
printf ("(%d %c %d) %c (%d %c %d)\n",num[numlow[m][0]],sign (i),num[numlow[m][1]],sign (k),num[numlow[m][2]],sign (j),num[numlow[m][3]]);
}
}
}
}
goto loop;
}
/***** 计算 ******/
float calculate (float num1,float num2,int n) /**** n指定运算方式 *****/
{
if(num1==0) num1=0.00001; /***** 避免除数为零 ****/
if(num2==0) num2=0.00001;
switch(n)
{
case 1: return (num1+num2);
case 2: return (num1-num2);
case 3: return (num2-num1);
case 4: return (num1*num2);
case 5: return (num1/num2);
case 6: return (num2/num1);
}
}
/**** 输出 ****/
char sign (int n)
{
switch(n)
{
case 1: return ('+'); break;
case 2: return ('-'); break;
case 3: return ('~'); break; /**** ~表示反减 *****/
case 4: return ('*'); break;
case 5: return ('/'); break;
case 6: return ('\\'); break; /****** \表示反除 ********/
}
}
Uc :hqsatnet
#include <stdio.h>
#include <math.h>
int num[4];
int numlow[24][4] ={0,1,2,3, /* 1****** numlow为num下标 ****/
0,2,1,3, /* 2*/
1,0,2,3, /* 3*/
1,2,0,3, /* 4*/
2,0,1,3, /* 5*/
2,1,0,3, /* 6*/
0,1,3,2, /* 7*/
0,2,3,1, /* 8*/
1,0,3,2, /* 9*/
1,2,3,0, /* 10*/
2,0,3,1, /* 11*/
2,1,3,0, /* 12*/
0,3,1,2, /* 13*/
0,3,2,1, /* 14*/
1,3,0,2, /* 15*/
1,3,2,0, /* 16*/
2,3,0,1, /* 17*/
2,3,1,0, /* 18*/
3,0,1,2, /* 19*/
3,0,2,1, /* 20*/
3,1,0,2, /* 21*/
3,1,2,0, /* 22*/
3,2,0,1, /* 23*/
3,2,1,0}; /* 24*/
main()
{
float calculate (float num1,float num2,int n);
char sign (int n);
loop:
scanf("%d%d%d%d",&num[0],&num[1],&num[2],&num[3]);
/***** 计算 ******/
for (int m=0;m<24;m++) /***** 遍历所有排列 *****/
{
for (int k=1;k<7;k++) /******* 遍历所有运算方式 *******/
{
for (int j=1;j<7;j++) /******* 遍历所有运算方式 *******/
{
for (int i=1;i<7;i++) /******* 遍历所有运算方式 *******/
{
if(fabs(calculate (calculate (calculate ( /****** 计算 ((A★B)★C)★D 类型***/
float(num[numlow[m][0]]),float(num[numlow[m][1]]),i)
,float(num[numlow[m][2]]),j)
,float(num[numlow[m][3]]),k) - 24)<0.01)
printf ("((%d %c %d) %c %d) %c %d\n",num[numlow[m][0]],sign (i),num[numlow[m][1]],sign (j),num[numlow[m][2]],sign (k),num[numlow[m][3]]);
if(fabs(calculate ( /**** 计算 (A★B)★(C★D) 类型******/
calculate (float(num[numlow[m][0]]),float(num[numlow[m][1]]),i)
,calculate (float(num[numlow[m][2]]),float(num[numlow[m][3]]),j)
,k) - 24)<0.01)
printf ("(%d %c %d) %c (%d %c %d)\n",num[numlow[m][0]],sign (i),num[numlow[m][1]],sign (k),num[numlow[m][2]],sign (j),num[numlow[m][3]]);
}
}
}
}
goto loop;
}
/***** 计算 ******/
float calculate (float num1,float num2,int n) /**** n指定运算方式 *****/
{
if(num1==0) num1=0.00001; /***** 避免除数为零 ****/
if(num2==0) num2=0.00001;
switch(n)
{
case 1: return (num1+num2);
case 2: return (num1-num2);
case 3: return (num2-num1);
case 4: return (num1*num2);
case 5: return (num1/num2);
case 6: return (num2/num1);
}
}
/**** 输出 ****/
char sign (int n)
{
switch(n)
{
case 1: return ('+'); break;
case 2: return ('-'); break;
case 3: return ('~'); break; /**** ~表示反减 *****/
case 4: return ('*'); break;
case 5: return ('/'); break;
case 6: return ('\\'); break; /****** \表示反除 ********/
}
}