速算遊戲_NOI導刊2011提升(04)

這道題會作到懷疑人生,好了廢話很少說,咱們發現這道題是一道深搜。可是字典序殊不知道怎麼排,咱們發現沒算一個運算符就會填加一個括號,因此咱們用一個char變量貯儲字典序最小的東西。數組

代碼:code

#include<cstring>
#include<cstdio>
typedef char String[20];
int a[4],b[4], ans[4][2];
String x[4],m,mina="zzzzz";
char op[4],data[4];
void print()
{
    for(int i=0;i<4;i++)
    {
        sprintf(x[i],"%c",data[i]);//將原來數組記錄一下
    }
    for(int i=0;i<3;i++)
    {
        sprintf(m,"(%s%c%s)",x[ans[i][0]],op[i],x[ans[i][1]]);//去找字典序最小的值
        strcpy(x[ans[i][0]],m);//複製粘貼
    }
    if(strcmp(mina,x[ans[2][0]])>0)
    {
        strcpy(mina,x[ans[2][0]]);//比較
    }
}
void dfs(int k)
{
    if(k==3)
    {
        int i;
        for(i=0;i<4;i++)
            if(a[i]!= 0) break;//將a[i]數組的值存到a[3]裏,方便判斷
        if(i<4&&a[i]==24)
        {
            print();
        }
        return;
    }
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(i!=j&&a[j]!=0&&a[i]!=0)
            {
                int t1,t2;
                //加操做
                t1=a[i],t2=a[j];
                a[i]=a[i]+a[j];a[j]=0;
                ans[k][0]=i,ans[k][1]=j;//記錄本次的加數
                op[k]='+';//記錄符號
                dfs(k+1);//再搜一遍
                a[i]=t1,a[j]=t2;
                //減操做
                t1=a[i];
                t2=a[j];
                a[i]=a[i]-a[j];
                a[j]=0;
                ans[k][0]=i;
                ans[k][1]=j;
                op[k]='-';//記錄
                dfs(k+1);
                a[i]=t1;
                a[j]=t2;
                //乘
                t1=a[i];
                t2=a[j];
                a[i]=a[i]*a[j];
                a[j]=0;
                ans[k][0]=i;
                ans[k][1]=j;
                op[k]='*';
                dfs(k+1);
                a[i]=t1;
                a[j]=t2;
                //判斷會不會出現小數            
                if(a[i]%a[j]==0)
                {
                    t1=a[i];
                    t2=a[j];
                    a[i]=a[i]/a[j];
                    a[j]=0;
                    ans[k][0]=i;
                    ans[k][1]=j;
                    op[k]='/';
                    dfs(k+1);
                    a[i]=t1;
                    a[j]=t2;
                }
            }
        }
    }
}
int main()
{
    char hh;
    memset(ans,-1,sizeof(ans));
    for(int i=0;i<4;i++)
    {
        scanf("%c ", &hh);//我覺得會出現A,T,J,Q,K。
        data[i]=hh;
        if(hh=='A') a[i]=1;
        else if(hh=='T') a[i]=10;
        else if(hh=='J') a[i]=11;
        else if(hh=='Q') a[i]=12;
        else if(hh=='K') a[i]=13;
        else
        {
            a[i]=hh-'0';
        }
    }
    memcpy(b,a,sizeof(a));//其實能夠刪掉。
    dfs(0);//搜素
    printf("%s\n", mina);//輸出
    return 0;
}

.....blog

相關文章
相關標籤/搜索