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++的主要内容,如果未能解决你的问题,请参考以下文章
Problem C: 平面上的点——Point类 (III)
Problem C: 平面上的点和线——Point类Line类 (III)
c_cpp 使用不带Grabber的Point Cloud Library绘制从Kinect v1检索到的Point Cloud