point24 c++

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了point24 c++相关的知识,希望对你有一定的参考价值。

// 24点程序1.0版,seuliu,说明:
// 支持计算机出题或者输入4个数字求解(逗号分隔)
// 支持四则运算,最多2对/重括号
// 递归快速算法,全中文注释

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <time.h>

//24点程序,一括号位置有12,13,14(无括号),23,24,34,运算符号有+-*/四种
double fStack[8];//操作数栈
int cStack[8];//操作符栈
int nFTop=0;
int nCTop=0;
int FindNum=0;
int printon=1;
#define fabs(x) ((x>0)?x:-x)

//双目基本运算
int cal(double a, double b, int c, double* fAns)

switch(c)

case 1:
*fAns=a+b;
break;
case 2:
*fAns=a-b;
break;
case 3:
*fAns=a*b;
break;
case 4:
if(b!=0)
*fAns=a/b;
else
return -1;
break;

return 0;


//堆栈法求算术表达式的值
double run(double n[5], int b[3], int c[5])

memset(fStack,0,8*sizeof(double));
nFTop=0;
memset(cStack,0,8*sizeof(int));
nCTop=0;
//遍历4位数
if(c[1]==2)
n[1]=-fabs(n[1]);
else
n[1]=fabs(n[1]);
fStack[++nFTop]=n[1];//第一个操作数压栈;
cStack[++nCTop]=1;//第一个操作符总为1

if(1==b[1])

cStack[++nCTop]=-1;//运算符栈=-1表示括号,再次遇到括号时,运算将持续到此处

for(int i=2; i<=4; i++)

fStack[++nFTop]=n[i];
cStack[++nCTop]=c[i];
if(i==b[1])//左括号,入运算符栈

cStack[++nCTop]=-1;

if(i==b[2])//右括号,从最顶层弹出栈计算

//如果是括号内全是乘除法,直接跳过不做(非法表达式)
if (((c[i]>=3)&&(i-1==b[1]))||((c[i]>=3)&&(c[i-1]>=3)&&(i-2==b[1])))

return 0;

while(cStack[nCTop]!=-1)

if (cStack[nCTop-1]==2)//如果前一次运算是减法,当前加减运算换方向,乘除不变

int nCC=(cStack[nCTop]<3)?(cStack[nCTop]^0x03):cStack[nCTop];
if (cal(fStack[nFTop-1],fStack[nFTop],nCC,&fStack[nFTop-1])!=0)

return -1;

else if(cal(fStack[nFTop-1],fStack[nFTop],cStack[nCTop],&fStack[nFTop-1])!=0)
return -1;
nFTop--;
nCTop--;

nCTop--;//弹出左括号

if(cStack[nCTop]>=3)//乘除法优先运算,提前弹出运算符

if(i!=b[1])//不是左括号

if(cal(fStack[nFTop-1],fStack[nFTop],cStack[nCTop--],&fStack[nFTop-1]))
return -1;
nFTop--;



while(nFTop>1)

if (cStack[nCTop-1]==2)//如果前一次运算是减法,当前加减运算换方向,乘除不变

int nCC=(cStack[nCTop]<3)?(cStack[nCTop]^0x03):cStack[nCTop];
if (cal(fStack[nFTop-1],fStack[nFTop],nCC,&fStack[nFTop-1])!=0)
return -1;
else if(cal(fStack[nFTop-1],fStack[nFTop],cStack[nCTop],&fStack[nFTop-1])!=0)
return -1;
nFTop--;
nCTop--;

return fStack[1];


//固定括号在2、4位置的运算,c的每一位只有两种可能即 +-,+-,*/,+-
double run2(double n[5], int c[5])

n[1]=fabs(n[1])*(3-c[1]*2);
double f1=0,f2=0,fAns=0;
cal(n[1],n[2],c[2],&f1);
cal(n[3],n[4],c[4],&f2);
if(cal(f1,f2,c[3],&fAns)==0)
return fAns;
return -1;

void disp2(double n[5],int c[5])

char co[6]=" +-*/";
if (printon==1)
printf("(%d%c%d)%c(%d%c%d)=24\\n",(int)n[1],co[c[2]],(int)n[2],co[c[3]],(int)n[3],co[c[4]],(int)n[4]);
FindNum=1;

void fun2(double n[5])

int c[5];
for (int i=0; i<16; i++)

c[1]=i/8+1;
c[2]=(i%8)/4+1;
c[3]=(i%4)/2+3;
c[4]=i%2+1;
if(run2(n,c)==24)
disp2(n,c);


void disp(double n[5], int b[3], int c[5])

char co[6]=" +-*/";
if (printon==1)

for (int i=1; i<=4; i++)

if(i>=2)
printf("%c",co[c[i]]);
if (i==b[1])

printf("(");

printf("%d",(int)n[i]);
if (i==b[2])

printf(")");


printf("=24\\n");

FindNum=1;

//递归遍历所有运算符。
int funa(double n[5], int b[3], int c[5], int nCDeep)

int nLoop=(nCDeep==1)?2:4;//第一位仅仅+-两种符号需要穷举
for(c[nCDeep]=1; c[nCDeep]<=nLoop; c[nCDeep]++)

if(nCDeep<4)
funa(n,b,c,nCDeep+1);
else
//开始运算,b中是括号起止位置,c中是运算符
double ans=run(n,b,c);
if (ans==24)

// printf("%d,%d,%d,%d,%d,%d,\\n",b[1],b[2],c[1],c[2],c[3],c[4]);
disp(n,b,c);



return 0;


//递归遍历所有括号
int fun(double n[5], int b[3]/*括号位置*/, int nBDeep/*括号递归深度*/,int nStart/*括号起始位置*/)

//括号内的数先算,运算次序按照c[5]对应。c的对应关系是1--加,2--减,3--乘,4--除
for(b[nBDeep]=nStart; b[nBDeep]<=4; b[nBDeep]++)

if(nBDeep<2)
fun(n, b, nBDeep+1, b[nBDeep]+1);
else//现在有括号的穷举了.下面开始穷举运算符

int c[5]=0,0,0,0,0;
funa(n,b,c,1);


return 0;

int main(int argc, char *argv[])

//二括号位置有12-34,单独处理
double n[5]=0,2,3,5,6;
int b[3]=0,2,3;
int c[5]=0,1,3,1,1;
char cAgain=\'r\', cTemp=\' \';
srand((unsigned)time( NULL ));
printf("24 Point. 2005.10.16.13:00-15:00. Rik. \\nPressing \'y\' at moment of inquiring will input your question\\n");
while ((cAgain!=\'n\') && (cAgain!=\'N\'))

if (cAgain==\'y\'||cAgain==\'Y\')

FindNum=0;
printf("Input 4 intergers, separated by comma:");
scanf("%lf,%lf,%lf,%lf",&n[1],&n[2],&n[3],&n[4]);
fun(n,b,1,1);
fun2(n);
if (FindNum==0)

printf("No solution.\\n\\n");


else

FindNum=0;
while (FindNum==0)

for (int i=1; i<=4; i++)

n[i]=(int)(rand()*1.0/RAND_MAX*16);

printon=0;
fun(n,b,1,1);
fun2(n);
n[1]=fabs(n[1]);
printon=1;

printf("%.0lf %.0lf %.0lf %.0lf = 24 (Enter)",n[1],n[2],n[3],n[4]);

fflush(stdin);
scanf("%c",&cTemp);
fflush(stdin);

fun(n,b,1,1);
fun2(n);


printf("continue?(y/n/Enter):");

fflush(stdin);
scanf("%c",&cAgain);
fflush(stdin);

return 0;
参考技术A 真是厉害
佩服,佩服
只是main函数的第一个for循环的循环体中
if (num[i]<1 || num[i]>13 || num[i]!=int(num[i]))
后面的数据类型强制转换应该是(int)num[i]
即应该改成
if (num[i]<1 || num[i]>13 || num[i]!=(int)num[i])
否则无法运行
参考技术B //以下为24点程序//
// + - * / -- -/
// 0 1 2 3 4 5

#include<stdio.h>
#include<math.h>

int treat(float a,float b,float c,float d);
float myF(int flag,float m,float n);
void myPrint(int type,int i,int j,int k,float a,float b,float c,float d);

int time,temp=0;
void main()

int i,j,k,t,again,res,flag;
float num[4];
again=1;
while(again==1)

printf ("\nPlease Enter 4 nums(1~13):\n");
i=0;
flag=0;
while (flag==0)

i++;
// printf ("Input num-%d\n",i);
for(i=0;i<4;i++)

scanf("%f",&num[i]);
if (num[i]<1 || num[i]>13 || num[i]!=int(num[i]))
flag++;

if(flag!=0)

printf ("Error input again\n",i);
flag=0;

else
flag=1;

for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (j!=i)
for (k=0;k<4;k++)
if (k!=j && k!=i)
for (t=0;t<4;t++)
if (t!=i && t!=j && t!=k)

res=treat(num[i],num[j],num[k],num[t]);

if (res==0)
printf ("\nNo answer\n");
else ;
// printf ("time=%d\n\n",time);
printf ("\n1: Go on\n2: Quit\n");
scanf ("%d",&again);



int treat(float a,float b,float c,float d)

int i,j,k;
float sum1,sum2,sum3;
for (i=0;i<4;i++)
for (j=0;j<6;j++)
for (k=0;k<6;k++)

if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && d==0)))

sum1=myF(i,a,b);
sum2=myF(j,sum1,c);
sum3=myF(k,sum2,d);
if (fabs(sum3-24)<0.1)

temp++;
myPrint(1,i,j,k,a,b,c,d);
// printf ("sum1:myF(%d,%2.0f,%2.0f) sum1=%f\n",i,a,b,sum1);
// printf ("sum2:myF(%d,%2.0f,%2.0f) sum2=%f\n",j,c,d,sum2);
// printf ("1:myF(%d,myF(%d,myF(%d,%2.0f,%2.0f),%2.0f),%2.0f) sum3=%f\n\n",k,j,i,a,b,c,d,sum3);


if (k==2)

sum1=myF(i,a,b);
sum2=myF(j,c,d);
sum3=sum1*sum2;
if (fabs(sum3-24)<0.1)

temp++;
myPrint(2,i,j,k,a,b,c,d);
// printf ("sum1:myF(%d,%2.0f,%2.0f) sum1=%f\n",i,a,b,sum1);
// printf ("sum2:myF(%d,%2.0f,%2.0f) sum2=%f\n",j,c,d,sum2);
// printf ("2:myF(%d,myF(%d,%2.0f,%2.0f),myF(%d,%2.0f,%2.0f)) sum3=%f\n\n",k,i,a,b,j,c,d,sum3);



if (k==3)

sum1=myF(i,a,b);
sum2=myF(j,c,d);
if (sum2!=0)

sum3=sum1/sum2;
if (fabs(sum3-24)<0.1)

temp++;
myPrint(3,i,j,k,a,b,c,d);
// printf ("sum1:myF(%d,%2.0f,%2.0f) sum1=%f\n",i,a,b,sum1);
// printf ("sum2:myF(%d,%2.0f,%2.0f) sum2=%f\n",j,c,d,sum2);
// printf ("3:myF(%d,myF(%d,%2.0f,%2.0f),myF(%d,%2.0f,%2.0f)) sum3=%f\n\n",k,i,a,b,j,c,d,sum3);




if (temp==0)
return 0;
else
return 1;


float myF(int flag,float m,float n)

// time++;
if (flag==0)
return (m+n);
if (flag==1)
return (m-n);
if (flag==2)
return (m*n);
if (flag==3)
if (n==0)
return 30000;
else
return (m/n);
if (flag==4)
return (n-m);
if (flag==5)
if (m==0)
return 30000;
else
return (n/m);
return 0;


void myPrint(int type,int i,int j,int k,float a,float b,float c,float d)

char sigle[6];
sigle[0]='+';
sigle[1]='-';
sigle[2]='*';
sigle[3]='/';
sigle[4]='-';
sigle[5]='/';
if (type==1)
if(j==4 || j==5)

if (k==4 || k==5)
printf("%2.0f %c (%2.0f %c (%2.0f %c %2.0f)) =24\n",d,sigle[k],c,sigle[j],a,sigle[i],b);
else
printf("(%2.0f %c (%2.0f %c %2.0f)) %c %2.0f =24\n",c,sigle[j],a,sigle[i],b,sigle[k],d);

else if (k==4 || k==5)

printf("%2.0f %c ((%2.0f %c %2.0f) %c %2.0f) =24\n",d,sigle[k],a,sigle[i],b,sigle[j],c);

else
printf("((%2.0f %c %2.0f) %c %2.0f) %c %2.0f =24\n",a,sigle[i],b,sigle[j],c,sigle[k],d);

if (type==2 || type==3)

// if (k==4 || k==5)
// printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f)=24\n",c,sigle[j],d,sigle[k],a,sigle[i],b);
// else
printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f) =24\n",a,sigle[i],b,sigle[k],c,sigle[j],d);



望采纳!!!
参考技术C 真是高手,小弟佩服

以上是关于point24 c++的主要内容,如果未能解决你的问题,请参考以下文章

24 Point game

nyoj 43 24 Point game

nyoj43 24 Point game(DFS)

Problem C: 平面上的点——Point类 (III)

Problem C: 平面上的点和线——Point类Line类 (III)

c_cpp 使用不带Grabber的Point Cloud Library绘制从Kinect v1检索到的Point Cloud