Cdoj 24點遊戲之解題報告
阿新 • • 發佈:2019-02-06
24點遊戲
Time Limit: 20 Sec
Memory Limit: 256 MB
題目連線
http://acm.uestc.edu.cn/#/problem/show/1252
Description
24點就是給你一串數字,問你是否通過加減乘除括號構成24點。
沈爺覺得這個很好玩,就決定考考你,給你4個數,可以交換位置,可以用加減乘除和括號,是否能構成24點呢?
注意哦~這裡的除法並不是整數除法,比如樣例
Input
第一行T,表示有多少組測試資料,1≤T≤50
接下來T行,每行4個正整數a1, a2, a3, a4,表示每個數都是多少,1≤ai≤13
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下去!