[華爲oj]24點問題

這裏提供本身解二十四點的思路。總的思路就是用相似遞歸思想: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 }
相關文章
相關標籤/搜索