HDU - 1427 速算24点(dfs)
生活随笔
收集整理的這篇文章主要介紹了
HDU - 1427 速算24点(dfs)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:模擬24點游戲,判斷是否有解,規則如下:給出四張撲克牌,分別對應著1~13中的四個數,若這四個數字可以通過加減乘除四則運算使結果最后為24,則有解,反之無解
題目分析:因為只有四個撲克牌+四種運算,我們可以直接爆搜,這可肯定是不會超時也不會爆棧的,可是這個題目似乎并不是很簡單,有時候直接讓爆搜的題反而不太會操作了。
這里我是參考了網上一個大佬的思路,也就是一開始先對四張撲克牌進行全排列,枚舉出每一種可行的順序,然后對相鄰的兩個撲克牌操作即可,這樣就能遍歷到所有情況了
也沒什么好說的了,看代碼吧,代碼簡單易懂:
2021.7.25更新:
數據太水,之前的假算法隨便過,更新了一下正解
// #pragma GCC optimize(2) // #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #include<list> #include<unordered_map> #define lowbit(x) (x&-x) using namespace std; typedef long long LL; typedef unsigned long long ull; template<typename T> inline void read(T &x) {T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f; } template<typename T> inline void write(T x) {if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0'); } const int inf=0x3f3f3f3f; const int N=1e6+100; string s[4]; int a[5]; bool flag; int getnum(string str) {if(str.size()==2)return 10; if(str[0]=='A')return 1;if(str[0]=='J')return 11;if(str[0]=='Q')return 12;if(str[0]=='K')return 13;return str[0]-'0'; } void dfs(int step) {if(flag) {return;}if(step==4) {if(a[1]==24) {flag=true;}return;}int A[5];for(int i=1;i<=4;i++) {A[i]=a[i];}for(int i=1;i<=4-step+1;i++) {for(int j=1;j<=4-step+1;j++) {if(i==j) {continue;}for(int k=1;k<=4;k++) {if(k==1) {a[i]+=a[j];} else if(k==2) {a[i]-=a[j];} else if(k==3) {a[i]*=a[j];} else if(k==4) {if(a[j]==0||a[i]%a[j]!=0) {continue;}a[i]/=a[j];}swap(a[j],a[4-step+1]);dfs(step+1);for(int i=1;i<=4;i++) {a[i]=A[i];}}}} } int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);while(cin>>s[0]>>s[1]>>s[2]>>s[3]){for(int i=0;i<4;i++)a[i+1]=getnum(s[i]);flag=false;dfs(1);if(flag)printf("Yes\n");elseprintf("No\n");}return 0; }總結
以上是生活随笔為你收集整理的HDU - 1427 速算24点(dfs)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 3074 Sudoku(DL
- 下一篇: POJ - 3700 Missile D