UESTC 1252 24点游戏 DFS

ProLightsfx 2016-8-9 125 8/9

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一般没有;
 
#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 -
Tag:

ProLightsfx

11月15日21:08

最后修改:2024年11月15日
0

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论