HDU1427速算24點(dfs)

ZMST發表於2018-12-05

題目連結:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
int a[10];
bool dfs(int x)
{
    if(x==3)
    {
        if(24==a[x])
            return true;
        else
            return false;
    }
    int i,j;
    for(i=x;i<4;i++)
    {
        for(j=i+1;j<4;j++)
        {
            int cc=a[i];
            int dd=a[j];
            a[i]=a[x];
            a[j]=cc+dd;
            if(dfs(x+1))
                return true;
            a[j]=cc*dd;
            if(dfs(x+1))
                return true;
            a[j]=cc-dd;
            if(dfs(x+1))
                return true;
            a[j]=dd-cc;
            if(dfs(x+1))
                return true;
            if(dd!=0&&cc%dd==0)
            {
                a[j]=cc/dd;
                if(dfs(x+1))
                    return true;
            }
            if(cc!=0&&dd%cc==0)
            {
                a[j]=dd/cc;
                if(dfs(x+1))
                    return true;
            }
            a[i]=cc;
            a[j]=dd;
        }
    }
    return false;
}
int Change(char* ch)
{
    if(ch[0]=='A')
        return 1;
    else if(ch[0]=='J')
        return 11;
    else if(ch[0]=='Q')
        return 12;
    else if(ch[0]=='K')
        return 13;
    else if(strlen(ch)==2)
        return 10;
    else
        return ch[0]-'0';
}
int main()
{
    char c[10];
    while (~scanf("%s",c))
    {
        a[0]=Change(c);
        for(int i=1;i<4;i++)
        {
            scanf("%s",c);
            a[i]=Change(c);
        }
        if(dfs(0))
            printf("Yes\n");
        else
            printf("No\n");
        memset(a, 0, sizeof(a));
    }
    return 0;
}