這裏提供本身解二十四點的思路。總的思路就是用相似遞歸思想:ios
(1)在4個數中選兩個數進行運算,與另外兩個數放在一塊兒,執行步驟(2);spa
判斷步驟(2)返回結果,爲1,返回結果1;爲0,繼續下一個運算,直至結束,返回結果0;code
(2)在3個數中選兩個數進行運算,與另外一個數放在一塊兒,執行步驟(3);blog
判斷步驟(3)返回結果,爲1,返回結果1;爲0,繼續下一個運算,直至結束,返回結果0;遞歸
(3)對兩個數進行運算,判斷是否爲24。是,返回1;否,返回0。ci
這個思想就是窮舉方法,列出全部可能的狀況,有個好處就是不須要考慮括號的狀況。代碼比較多,但應該比較好理解一點。兩個細節:it
1)在兩個數進行運算的時候,須要把前後順序也考慮進去。io
2)當除數爲0時,顯然不知足狀況,所以,返回一個比較大的值。class
具體代碼以下:stream
1 #include <iostream> 2 3 using namespace std; 4 5 char op[4]={'+','-','*','/'}; 6 7 float CalNum(float a,float b,char op) 8 { 9 if(b==0) 10 return 10000; 11 12 float t=0; 13 switch(op) 14 { 15 case '+': 16 t=a+b; 17 break; 18 case '-': 19 t=a-b; 20 break; 21 case '*': 22 t=a*b; 23 break; 24 case '/': 25 t=a/b; 26 break; 27 } 28 return t; 29 } 30 31 float Cal2Num(float a[]) 32 { 33 float result=0; 34 for(int i=0;i<2;i++) 35 { 36 for(int p=0;p<4;p++) 37 { 38 result=CalNum(a[i],a[1-i],op[p]); 39 if(result==24) 40 { 41 return 1; 42 } 43 } 44 } 45 return 0; 46 } 47 48 float Cal3Num(float a[]) 49 { 50 float a2[2]; 51 for(int i3=0;i3<3;i3++) 52 { 53 for(int j3=i3+1;j3<3;j3++) 54 { 55 for(int k=0;k<3;k++) 56 { 57 if(k!=i3&&k!=j3) 58 a2[1]=a[k]; 59 } 60 61 for(int p=0;p<4;p++) 62 { 63 for(int d=0;d<2;d++) 64 { 65 if(d==0) 66 a2[0]=CalNum(a[i3],a[j3],op[p]); 67 else 68 a2[0]=CalNum(a[j3],a[i3],op[p]); 69 if(Cal2Num(a2)) 70 return 1; 71 } 72 } 73 } 74 } 75 return 0; 76 } 77 78 float Cal4Num(float a[]) 79 { 80 float a3[3]; 81 for(int i=0;i<4;i++) 82 { 83 for(int j=i+1;j<4;j++) 84 { 85 int t=1; 86 for(int m=0;m<4;m++) 87 { 88 if(m!=i&&m!=j) 89 a3[t++]=a[m]; 90 } 91 92 for(int p=0;p<4;p++) 93 { 94 for(int d=0;d<2;d++) 95 { 96 if(d==0) 97 a3[0]=CalNum(a[i],a[j],op[p]); 98 else 99 a3[0]=CalNum(a[j],a[i],op[p]); 100 if(Cal3Num(a3)) 101 return 1; 102 } 103 } 104 } 105 } 106 return 0; 107 } 108 109 int main() 110 { 111 float a4[4]; 112 cin>>a4[0]>>a4[1]>>a4[2]>>a4[3]; 113 if(Cal4Num(a4)) 114 cout<<"true"<<endl; 115 else 116 cout<<"false"<<endl; 117 return 0; 118 }