hdu 1427 速算24點【暴力枚舉】

速算24點c++

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6946    Accepted Submission(s): 1828.net

 

Problem Descriptionblog

速算24點相信絕大多數人都玩過。就是隨機給你四張牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'運算符以及括號改變運算順序,使得最終運算結果爲24(每一個數必須且僅能用一次)。遊戲很簡單,但遇到無解的狀況每每讓人很鬱悶。你的任務就是針對每一組隨機產生的四張牌,判斷是否有解。咱們另外規定,整個計算過程當中都不能出現小數。遊戲

 

 

Inputip

每組輸入數據佔一行,給定四張牌。string

 

 

Outputit

每一組輸入數據對應一行輸出。若是有解則輸出"Yes",無解則輸出"No"。io

 

 

Sample Inputim


 
A 2 3 6 3 3 8 8數據

 

 

Sample Output


 
Yes No

 

 

Author

LL

 

 

Source

ACM暑期集訓隊練習賽(三)

因規模不大,直接暴力枚舉了全部狀況。

AC代碼以下:

//1427 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int sum(int a,int b,int c,int d)   //枚舉不加括號全部狀況
{
    char str[4]={'+','-','*','/'};
    int i,j,k,l,ans=0,n,m,p;
    for(i=0;i<2;i++)
    {
        ans=0;
        if(i==1)
            ans-=a;
        else
            ans+=a;
        n=ans;
        for(j=0;j<4;j++)
        {ans=n;
            if(j==0)
                ans+=b;
            else if(j==1)
                ans-=b;
            else if(j==2)
                ans*=b;
            else
                if(ans%b==0&&b!=0)
                    ans/=b;
                else 
                    continue;
                m=ans;
            for(k=0;k<4;k++)
            {ans=m;
                if(k==0)
                    ans+=c;
                else if(k==1)
                    ans-=c;
                else if(k==2)
                    ans*=c;
                else
                    if(ans%c==0&&c!=0)
                        ans/=c;
                    else 
                        continue;
                    p=ans;
                for(l=0;l<4;l++)
                {ans=p;
                    if(l==0)
                        ans+=d;
                    else if(l==1)
                        ans-=d;
                    else if(l==2)
                        ans*=d;
                    else
                        if(ans%d==0&&d!=0)
                            ans/=d;
                        else 
                            continue;
                    if(ans==24)
                    {
                        //printf("%c%d%c%d%c%d%c%d=%d\n",str[i],a,str[j],b,str[k],c,str[l],d,ans); //輸出算式
                        return 1;
                    }
                }
            }
        }
    }
    return 0;
}

int kh(int a,int b,int c,int d)  //枚舉加括號的全部狀況
{
    char str[4]={'+','-','*','/'};
    int ans,bns,sum,i,j,k,l;
    for(i=0;i<4;i++)
    {
        ans=0;
        if(i==0)
            ans=a+b;
        else if(i==1)
            ans=a-b;
        else if(i==2)
            ans=a*b;
        else 
            if(i==3&&a%b==0)
                ans=a/b;
            else 
                continue;
        for(j=0;j<4;j++)
        {
            bns=0;
            if(j==0)
                bns=c+d;
            else if(j==1)
                bns=c-d;
            else if(j==2)
                bns=c*d;
            else 
                if(j==3&&c%d==0)
                    bns=c/d;
                else 
                    continue;
            for(k=0;k<4;k++)
            {
                sum=0;
                if(k==0)
                    sum=ans+bns;
                else if(k==1)
                    sum=ans-bns;
                else if(k==2)
                    sum=ans*bns;
                else 
                    if(k==3&&bns!=0&&ans%bns==0)
                        sum=ans/bns;
                    else 
                        continue;
                if(sum==24)
                {
                    //printf("(%d%c%d)%c(%d%c%d)=%d\n",a,str[i],b,str[k],c,str[j],d,sum); //輸出算式
                    return 1;
                }
            }
        }
    }
    return 0;
}

int main(){    int a,b,c,d,i,aa[4];        char temp[4][3];    char aAA[14][3]={"0","A","2","3","4","5","6","7","8","9","10","J","Q","K"};    while(scanf("%s %s %s %s",temp[0],temp[1],temp[2],temp[3])!=EOF)    {        int f=0;        for(int i=0;i<4;i++)//把牌轉換成對應的數字        {            for(int j=1;j<=13;j++)            if(strcmp(temp[i],aAA[j])==0)            {                aa[i]=j;                break;            }        }                for(a=0;a<4;a++)        //全排        {            if(f==1) break;            for(b=0;b<4;b++)            {                if(f==1) break;                if(b==a) continue;                for(c=0;c<4;c++)                {                    if(f==1) break;                    if(c==a||c==b) continue;                    d=6-a-b-c;                    if(sum(aa[a],aa[b],aa[c],aa[d])||kh(aa[a],aa[b],aa[c],aa[d]))                    {                        printf("Yes\n");                        f=1;                        break;                    }                }            }        }        if(f==0) printf("No\n");    }    return 0;}--------------------- 做者:yongtaozheng 來源:CSDN 原文:https://blog.csdn.net/Twinkle_sone/article/details/95041176 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索