1. 程式人生 > >Cdoj 24點遊戲之解題報告

Cdoj 24點遊戲之解題報告

24點遊戲

Time Limit: 20 Sec

Memory Limit: 256 MB

題目連線

http://acm.uestc.edu.cn/#/problem/show/1252

Description

24點就是給你一串數字,問你是否通過加減乘除括號構成24點。

沈爺覺得這個很好玩,就決定考考你,給你4個數,可以交換位置,可以用加減乘除和括號,是否能構成24點呢?

注意哦~這裡的除法並不是整數除法,比如樣例

Input

第一行T,表示有多少組測試資料,1T50

接下來T行,每行4個正整數a1a2a3a4,表示每個數都是多少,1ai13

Output

對於每一次詢問,如果能夠湊成24

點,輸出yes,否則輸出no

Sample Input

2
3 3 8 8
1 1 1 1

Sample Output

yes

no

對於這題筆者是看了大牛的正解之後才知道該如何用DFS(深搜)來解決這個問題;

下面就貼出程式碼吧:

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;

double value[4];

//對於此處的判斷是否是24點,是實數而且考慮負數 


bool DFS(int n)
{
     if(n==1)
     {    if(fabs(value[n-1]-24)<1e-6)  return true;  
          else                          return false;
     }
     else{
          for(int i=0;i<n;++i)
             for(int j=i+1;j<n;++j)
             {  double x1 = value[i];
                double x2 = value[j];     
                value[j] = value[n-1];    //將後面的數提到前面來,以便於後面的計算 
                value[i] = x1+x2; if(DFS(n-1))  return true;
                value[i] = x1*x2; if(DFS(n-1))  return true;
                value[i] = x1-x2; if(DFS(n-1))  return true;
                value[i] = x2-x1; if(DFS(n-1))  return true;
                if(x1){  value[i] = x2/x1; if(DFS(n-1)) return true; }
                if(x2){  value[i] = x1/x2; if(DFS(n-1)) return true; }
                //對於數value[j]沒有滿足條件,所以還原原來的數 
                value[i] = x1;   
                value[j] = x2;
             }
     }
     //若n為數都不滿足的話,就返回false 
     return false;
}

int main(void)
{
    int T;
    cin>>T;
    
    while(T--)
    {
         cin>>value[0]>>value[1]>>value[2]>>value[3];
         if(DFS(4))  cout<<"yes\n";
         else        cout<<"no\n";
    }
    
    return 0;
} 

如果你還沒搞清楚狀況的話可以點選一下下面的傳送門:

路漫漫其修遠兮,吾將hold下去!