24点游戏(dfs)

Posted handsomecui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了24点游戏(dfs)相关的知识,希望对你有一定的参考价值。

24点游戏

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

2424点就是给你一串数字,问你是否通过加减乘除括号构成2424点。

沈爷觉得这个很好玩,就决定考考你,给你44个数,可以交换位置,可以用加减乘除和括号,是否能构成2424点呢?

注意哦~这里的除法并不是整数除法,比如样例

Input

第一行TT,表示有多少组测试数据,1T501≤T≤50

接下来TT行,每行44个正整数a1a1, a2a2, a3a3, a4a4,表示每个数都是多少,1ai131≤ai≤13

Output

对于每一次询问,如果能够凑成2424点,输出yes,否则输出no

Sample input and output

Sample InputSample Output
2
3 3 8 8
1 1 1 1
yes
no

Hint

33 33 88 88

就可以构造出 8÷(38÷3)=24

题解:求24点,暴力搜索下就好,刚开始我想着全排列下,然后按照顺序来进行,但是思路明显不完善,然后看了大神的,

大神是延长数组存放当前运算的解,vis记录是否用过,思路很巧妙;很简单就A过了;

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define P_ printf(" ")
#define mem(x,y) memset(x,y,sizeof(x))
typedef long long LL;
int flot;
double a[110];
int vis[110];
/*void dfs(int pos,double cur);
void ary(int num){
    if(flot)return;
    if(num==4){
    //    for(int i=0;i<4;i++)printf("%d ",ans[i]);puts("");
        dfs(1,ans[0]);
        return;
    }
    for(int i=0;i<4;i++){
        if(vis[i])continue;
        ans[num]=a[i];
        vis[i]=1;
        ary(num+1);
        vis[i]=0;
    }
}
*/
void dfs(int usd,int tp){
    if(flot)return;
    if(usd==4){
        if(abs(a[tp-1]-24)<1e-8)flot=1;
        return;
    }
    /*
    dfs(pos+1,cur+ans[pos]);
    dfs(pos+1,cur-ans[pos]);
    dfs(pos+1,cur*ans[pos]);
    dfs(pos+1,cur/ans[pos]);
    dfs(pos+1,-cur*ans[pos]);
    dfs(pos+1,-cur/ans[pos]);
    dfs(pos+1,ans[pos]/cur);
    dfs(pos+1,ans[pos]/cur);
    */
    for(int i=0;i<tp;i++){
        if(vis[i])continue;
        vis[i]=1;
        for(int j=i+1;j<tp;j++){
            if(vis[j])continue;
            vis[j]=1;
            a[tp]=a[i]+a[j];dfs(usd+1,tp+1);
            a[tp]=a[i]*a[j];dfs(usd+1,tp+1);
            a[tp]=a[i]-a[j];dfs(usd+1,tp+1);
            a[tp]=a[j]-a[i];dfs(usd+1,tp+1);
            if(a[i]!=0){
                a[tp]=a[j]/a[i];dfs(usd+1,tp+1);
            }
            if(a[j]!=0){
                a[tp]=a[i]/a[j];dfs(usd+1,tp+1);
            }
            vis[j]=0;
        }
        vis[i]=0;
    }
}
int main(){
    int T;
    SI(T);
    while(T--){
        for(int i=0;i<4;i++)scanf("%lf",&a[i]);
        flot=0;
        mem(vis,0);
        dfs(1,4);
        if(flot)puts("yes");
        else puts("no");
    }
    return 0;
}

 

以上是关于24点游戏(dfs)的主要内容,如果未能解决你的问题,请参考以下文章

dfs(vijos113424点游戏)

TOJ 1344 速算24点(全排列+dfs)

python实现24点游戏(地球上最短的24点游戏代码?)

dfs套dfs套dfs算24点

HDU 1427 速算24点数值型DFS

24点游戏