📄 24点.cpp
字号:
/* 24点运算程序 */
///////////////////////////////////////////////////////////////
#include "head.cpp"
int main()
{
int i1,i2,i3,i4,
j1,j2,j3,f=0,
k1,k2,x;
int num[4],tmp1[4]; //运算数字及临时存放数组
char sg[]={'*','/','+','-'}; //运算符
node ex[19]={'#','^','^',0,0,
'^','^',0,'^',0,
'^',0,'^','^',0,
0,'^','^','#'}; //存放表达式
bool vflag[]={0,0,0,0}; //num[i]有无被访问过的标记
int fvposition[]={0,0,0,0}; //访问起始标记
int lvposition[]={0,0,0,0}; //上一轮访问位置
int times[]={6,2,1,0}; //访问起始标志变化的轮回数
cout<<"你可以输入任意4个大小不限的正整数,不要输入字母"<<endl;
for(i1=0;i1<4;i1++)
{
cin>>num[i1];
if(num[i1]<=0){
cout<<"输入要大于零,请重新输入"<<endl;
i1--;
continue;
}
}
for(x=i1=0;i1<4;i1++)
{
for(i2=fvposition[i1];i2<4;i2++) //挑选赋值
{
if(vflag[i2])continue; //值未被访问过
tmp1[i1]=num[i2]; //赋值
vflag[i2]=1; //访问标记置1
lvposition[i1]=i2; //记录本轮各访问位置
break;
}
if(i1==3){
x++;
for(i3=0;i3<4;i3++)ex[4*i3+3]=tmp1[i3]; //一次运算数赋值
for(j1=0;j1<4;j1++)
{
for(j2=0;j2<4;j2++)
{
for(j3=0;j3<4;j3++)
{
ex[4]=sg[j1];
ex[9]=sg[j2];
ex[14]=sg[j3]; //加运算符
for(k1=2;k1<11;k1+=4) //一对括号的情况
{
for(k2=k1+6;k2<17;k2+=4)
{
ex[k1]='(';
ex[k2]=')';
if(caclexp(ex))
{
if(k1==2&&k2==16)ex[2]=ex[16]='^';
prexp(ex);
f=1;
goto result;
}
ex[k1]=ex[k2]='^'; //还原
}
}
for(k1=1;k1<6;k1+=4) //加两个括号的情况
{
for(k2=k1+1;k2<k1+6;k2+=4)
{
ex[k1]=ex[k2]='(';
ex[k1+12]=ex[k2+6]=')';
if(caclexp(ex)) //计算结果是否为24
{
prexp(ex); //输出表达式
f=1;
goto result;
}
ex[k1]=ex[k1+12]=ex[k2]=ex[k2+6]='^';
}
}
ex[1]=ex[10]='('; //另一种两个括号的情况
ex[8]=ex[16]=')';
if(caclexp(ex))
{
prexp(ex);
f=1;
goto result;
}
ex[1]=ex[10]='^';
ex[8]=ex[16]='^';
}
}
} //一轮计算完毕
if(x==24)break;
for(i3=0;i3<4;i3++) //改变下一轮起始访问地点
{
if(!(x%times[i3]))
{
fvposition[i3]=lvposition[i3]+1; //根据上轮访问位置置下一轮访问起始位置
for(i4=i3+1;i4<4;i4++)fvposition[i4]=0;
break;
}
}
for(i3=0;i3<4;i3++)vflag[i3]=0;
i1=-1;
}
}
result: if(!f)cout<<"无解"<<endl;
system("PAUSE");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -