當前位置:編程學習大全網 - 編程語言 - 編程求計算24點的方法

編程求計算24點的方法

解法用到的基本思想就是回溯,樹的深度為最深為4,樹的判斷分支為 加減乘除,對不滿足條件的解進行剪枝(即當前結果>=24),當到達遞歸邊界(即樹的深度為四時)時,即判斷當前的結果是否符合條件(=24),符合即找到解,否則繼續進行。

參考代碼如下:

#include<iostream>

#include<math.h>

using namespace std;

const double MIN=1E-6;

void Print(int *Rank,double *FourNum)

{

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

cout<<FourNum[Rank[i]]<<" ";

cout<<endl;

}

void Calculate_24(int *Rank,int *FourNum,char *Oper,int i,int j,int k,bool &def)

{

double res=0;

switch(i)

{

case 0:

res=FourNum[Rank[0]]+FourNum[Rank[1]];

break;

case 1:

res=FourNum[Rank[0]]-FourNum[Rank[1]];

break;

case 2:

res=FourNum[Rank[0]]*FourNum[Rank[1]];

break;

case 3:

res=FourNum[Rank[0]]/FourNum[Rank[1]];

break;

}

switch(j)

{

case 0:

res=res+FourNum[Rank[2]];

break;

case 1:

res=res-FourNum[Rank[2]];

break;

case 2:

res=res*FourNum[Rank[2]];

break;

case 3:

res=res/FourNum[Rank[2]];

break;

}

switch(k)

{

case 0:

res=res+FourNum[Rank[3]];

break;

case 1:

res=res-FourNum[Rank[3]];

break;

case 2:

res=res*FourNum[Rank[3]];

break;

case 3:

res=res/FourNum[Rank[3]];

break;

}

if(fabs(res-24)>MIN)

return;

else

{

def=true;

for(int num=1;num<=7;num++)

{

switch(num)

{

case 1:

cout<<FourNum[Rank[0]];

break;

case 3:

cout<<FourNum[Rank[1]];

break;

case 5:

cout<<FourNum[Rank[2]];

break;

case 7:

cout<<FourNum[Rank[3]];

break;

case 2:

cout<<Oper[i];

break;

case 4:

cout<<Oper[j];

break;

case 6:

cout<<Oper[k];

break;

}

}

cout<<endl;

}

}

void SearchTree(int Depth,int *Rank,int *FourNum,char *Oper,bool &def)

{

int i,j,k;

if(Depth==4)

{

for(i=0;i<4;i++)

for(j=0;j<4;j++)

for(k=0;k<4;k++)

Calculate_24(Rank,FourNum,Oper,i,j,k,def);

}

else

{

for(i=0;i<4;i++)

{

int Remember=0;

for(j=0;j<Depth;j++)

{

if(Rank[j]==i)

Remember=1;

}

if(Remember)

continue;

Rank[Depth]=i;

SearchTree(Depth+1,Rank,FourNum,Oper,def);

}

}

}

int main()

{

int a[4],b[4],time;

char c[4]={'+','-','*','/'};

bool def=false;

cin>>time;

while(time--)

{

for(int i=0;i<4;i++)//輸入測試數據

cin>>a[i];

cout<<"所有可能的結果:"<<endl;

SearchTree(0,b,a,c,def);

if(def==false)

cout<<"No"<<endl;

}

return 0;

}

  • 上一篇:為什麽白打扮得性感,黑木耳打扮得暴露?為什麽白在同壹件衣服裏穿的很優雅,而黑木耳卻可以?
  • 下一篇:Python學到什麽程度可以面試工作
  • copyright 2024編程學習大全網