24點遊戲ios
Time Limit: 1000MS | Memory Limit: 65535KB | 64bit IO Format: %lld & %llu |
Descriptionui
24點就是給你一串數字,問你是否經過加減乘除括號構成 24點。spa
沈爺以爲這個很好玩,就決定考考你,給你 4個數,能夠交換位置,能夠用加減乘除和括號,是否能構成 24點呢?.net
注意哦~這裏的除法並非整數除法,好比樣例code
Inputorm
第一行 T,表示有多少組測試數據, 1≤T≤50blog
接下來 T行,每行 4個正整數 a1, a2, a3, a4,表示每一個數都是多少, 1≤ai≤13遊戲
Outputip
對於每一次詢問,若是可以湊成 24點,輸出yes
,不然輸出no
Sample Input
2
3 3 8 8
1 1 1 1
Sample Output
yes
no
Hint
3 3 8 8
就能夠構造出 -
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; double num[10]; bool flag; bool dfs(int x) { if(x==1) { if(fabs(num[0]-24)<1e-2) return true; else return false; } double a,b; for(int i=0;i<x;i++) { for(int j=i+1;j<x;j++) { a=num[i]; b=num[j]; num[j]=num[x-1];//x表示運算的次數,也用來肯定區間, //每次x-1,同時區間縮小,num[0]做爲運算的結果 ,其實就是覆蓋計算過的數,後面的數向前移動一個位置。 num[i]=a+b;if(dfs(x-1)) return true; num[i]=a-b;if(dfs(x-1)) return true; num[i]=b-a;if(dfs(x-1)) return true; num[i]=a*b;if(dfs(x-1)) return true; if(b!=0) num[i]=a/b;if(dfs(x-1)) return true;//除法分母不爲0 if(a!=0) num[i]=b/a;if(dfs(x-1)) return true; num[i]=a;//回溯 num[j]=b; } } return false; } int main() { int t; cin>>t; while(t--) { flag=false; for(int i=0;i<4;i++) cin>>num[i]; if(dfs(4)) cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }