?? 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 + -