- 题意:给出四个数检验是否凑成24 即可。
- 思路:补充两种运算 a ⑤ b = b / a a ⑥ b = b - a 之后发现四个数进行所有运算无非就两种。
-
(((a ⊙ b) ⊙ c ) ⊙ d) ((a ⊙ b) ⊙ (c ⊙ d))
- 枚举四个数的位置。枚举这六种运算符即可,会有重复 总复杂度不高无需剪枝
-
#include<bits/stdc++.h> using namespace std; int t; double a[5],data[5]; bool vis[10],flag; double cal(double a,double b,int c) { double ret; if(c==1) ret=b+a; else if(c==2) ret=a-b; else if(c==3) ret=a*b; else if(c==4&&b) ret=a/b; else if(c==5) ret=b-a; else if(c==6&&a) ret=b/a; return ret; } void get() { for(int i=1; i<=6; i++) for(int j=1; j<=6; j++) for(int k=1; k<=6; k++) { if(cal(cal(data[1],data[2],i),cal(data[3],data[4],j),k)==24) { flag=1; return; } if(cal(cal(cal(data[1],data[2],i),data[3],j),data[4],k)==24) { flag=1; return; } } } void dfs(int deep) { if(flag)return; if(deep>4) { get(); return; } for(int i=1; i<=4; i++) if(vis[i]==0) { data[deep]=a[i]; vis[i]=1; dfs(deep+1); vis[i]=0; } } int main() { scanf("%d",&t); while(t--) { flag=0; memset(vis,0,sizeof(vis)); for(int i=1; i<=4; i++) scanf("%lf",&a[i]); dfs(1); if(flag)printf("Yes\n"); else printf("No\n"); } return 0; }
hihocoder-1304 搜索一·24点
最新推荐文章于 2021-02-23 16:34:18 发布