HDU 1427 速算24点

全排列,枚举运算符,枚举优先级。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int INF=0x7FFFFFFF;
char s[5];
int a[5],b[5],f[5],op[5],ans;

int get()
{
    if(s[0]=='A') return 1;
    if(s[0]=='J') return 11;
    if(s[0]=='Q') return 12;
    if(s[0]=='K') return 13;

    int sum=0;
    for(int i=0; s[i]; i++) sum=sum*10+s[i]-'0';
    return sum;
}

int w(int a,int b,int op)
{
    if(op==1) return a+b;
    if(op==2) return a-b;
    if(op==3) return a*b;
    if(op==4)
    {
        if(b==0) return 0x7fffffff;
        if(a%b!=0) return 0x7fffffff;
        return a/b;
    }
}

bool cal1(int op0,int op1,int op2)
{
    int x1=0,x2=0,x3=0;
    x1=w(b[0],b[1],op0);
    if(x1==INF) return 0;
    x2=w(x1,b[2],op1);
    if(x2==INF) return 0;
    x3=w(x2,b[3],op2);
    if(x3==INF) return 0;
    if(abs(x3)!=24) return 0;
    return 1;
}

bool cal2(int op0,int op1,int op2)
{
    int x1=0,x2=0,x3=0;
    x1=w(b[0],b[1],op0);
    if(x1==INF) return 0;
    x2=w(b[2],b[3],op2);
    if(x2==INF) return 0;
    x3=w(x1,x2,op1);
    if(x3==INF) return 0;
    if(abs(x3)!=24) return 0;
    return 1;
}

void dfs(int x)
{
    if(x==4)
    {
        for(op[0]=1;op[0]<=4;op[0]++)
        {
            for(op[1]=1;op[1]<=4;op[1]++)
            {
                for(op[2]=1;op[2]<=4;op[2]++)
                {
                    if(cal1(op[0],op[1],op[2])==1) ans=1;
                    if(ans==1) break;
                    if(cal2(op[0],op[1],op[2])==1) ans=1;
                    if(ans==1) break;
                }
                if(ans==1) break;
            }
            if(ans==1) break;
        }
        return;
    }
    for(int i=0;i<4;i++)
    {
        if(f[i]==1) continue;
        f[i]=1,b[x]=a[i];
        dfs(x+1); if(ans==1) return;
        f[i]=0;
    }
}

int main()
{
    while(~scanf("%s",s))
    {
        a[0]=get();
        scanf("%s",s); a[1]=get();
        scanf("%s",s); a[2]=get();
        scanf("%s",s); a[3]=get();

        memset(f,ans=0,sizeof f);
        dfs(0);

        if(ans==1) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

 

posted @ 2016-07-10 10:15  Fighting_Heart  阅读(360)  评论(0编辑  收藏  举报