当前位置:
首页 >
HDU - 1427 速算24点(dfs)
发布时间:2024/4/11
56
豆豆
生活随笔
收集整理的这篇文章主要介绍了
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