24点游戏 DFS
Source
第七届ACM趣味程序设计竞赛第二场(正式赛) E
My Solution
是学长提醒了括号的处理才会的,因为括号只是改变优先级,先算后算的问题,如果第一次C4 2则每个两两都算然后作为一个数,
储存到一个变量a[ i ]中,另一个数在这个递归被去掉,然后把a[ n-1 ]移到这个数的空间储存,因为a[ n-1 ]那个位置下一次的递归
中不会访问,便于控制吧。第二次C3 2,第三次C2 2。因此,每个二元组分别+(1)、-(2)、*、/ (1 or 2 or 0) 。
且什么最多50组数据,所以最多36*18*6*50=194400 不会超时。
另外:
1、注意除 0 ,所以除的时候要讨论能不能除;
2、精度问题,这里要求的是实数运算,但没有真正的分数,8/(1/3),会是8/0.3333....所以有个精度问题,学长说误差eps=0.01以内就可以。
笔者觉得这里用float比较好,反正不会溢出,且比double快,
Memory
也小一点吧。搜索中说double很容易出现浮点误差,而float一般没有;
Memory
也小一点吧。搜索中说double很容易出现浮点误差,而float一般没有;
#include
#include
#include
//#define LOCAL
float a[5];
//float感觉比double快一点
bool dfs(int n)
{
if(n==1){
if(fabs(a[0]-24)<1e-2) return true;
else return false;
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
float x=a[i]; //写dfs的时候不能把这里x、y放到全局
float y=a[j];
a[j]=a[n-1];
a[i]=x+y;if(dfs(n-1)) return true;
a[i]=x-y;if(dfs(n-1)) return true;
a[i]=y-x;if(dfs(n-1)) return true;
a[i]=x*y;if(dfs(n-1)) return true;
if(y) a[i]=x/y;if(dfs(n-1)) return true;
if(x) a[i]=y/x;if(dfs(n-1)) return true;
a[i]=x;
a[j]=y;
}
}
return false;
}
int main()
{
#ifdef LOCAL
freopen("a.txt","r",stdin);
#endif // LOCAL
int T;
scanf("%d",&T);
while(T--){
for(int i=0;i<4;i++)
scanf("%f",&a[i]);
if(dfs(4)) printf("yes");
else printf("no");
if(T) printf("n");
}
return 0;
}
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
- THE END -
最后修改:2024年11月15日
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/uestc-1252/
共有 0 条评论