TZOJ1344速算24点

具体题目

速算24点

题解

将纸牌的数值用数组记录,有括号改变运算顺序,所以先将数组从小到大排序然后全排列,分两种情况((a@b)@c)d和(a@b)@(c@d)用dfs暴力搜索

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string a[10];
int b[10],v[10];
int flag;
void dfs(int sum,int p,int x)
{
    // cout<<sum<<endl;
    if(flag) return;
    if(p==3) {
        // cout<<x<<endl;
        if(sum+x==24) flag=1;
        if(sum-x==24) flag=1;
        if(sum*x==24) flag=1;
        if(x!=0&&sum%x==0&&sum/x==24) flag=1;
        return;
    }
    //((ab)c)d
    dfs(sum+x,p+1,b[p+1]);
    dfs(sum-x,p+1,b[p+1]);
    dfs(sum*x,p+1,b[p+1]);
    if(x!=0&&sum%x==0)
        dfs(sum/x,p+1,b[p+1]);
    //(ab)(cd)
    dfs(sum,p+1,x+b[p+1]);
    dfs(sum,p+1,x-b[p+1]);
    dfs(sum,p+1,x*b[p+1]);
    if(x%b[p+1]==0)
        dfs(sum,p+1,x/b[p+1]);
}
int main()
{
    while(cin>>a[0]>>a[1]>>a[2]>>a[3])
    {
        flag=0;
        for(int i=0;i<4;i++) {
            if(a[i].size()==2) {
                b[i]=10;
            } else {
                if(a[i]=="A") b[i]=1;
                else if(a[i]=="J") b[i]=11;
                else if(a[i]=="Q") b[i]=12;
                else if(a[i]=="K") b[i]=13;
                else b[i]=a[i][0]-'0';
            }
        }
        sort(b,b+4);
        
        //全排列各种情况
        do{
            // for(int i=0;i<4;i++) cout<<b[i]<<" ";
            // cout<<endl;
            dfs(b[0],1,b[1]);
        }while(next_permutation(b,b+4)&&!flag);
        if(flag) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    // system("pause");
    return 0;
}
posted @ 2022-07-18 19:57  海盐味的苏打水  阅读(104)  评论(1编辑  收藏  举报