题解 | #24点运算#

24点运算

https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//DFS暴力枚举
int visit[4]={0},result_index=0,cal_char_index=0;
int result[4]={0};
char cal_char[4]={0};
int dfs(int a[],int sum){
    if(sum==24&&cal_char_index==3){
        return 1;
    }else{
        for(int i=0;i<4;i++){
            if(!visit[i]){
                visit[i]=1;
                int flag;
                result[result_index++]=a[i];
                cal_char[cal_char_index++]='+';
                if(dfs(a,sum+a[i])==0){
                    cal_char[--cal_char_index]='-';
                    cal_char_index++;
                    if(dfs(a,sum-a[i])==0){
                        cal_char[--cal_char_index]='*';
                        cal_char_index++;
                        if(dfs(a,sum*a[i])==0){
                            cal_char[--cal_char_index]='/';
                            cal_char_index++;
                            if(dfs(a,sum/a[i])==0){//加减乘除都不行
                                cal_char[--cal_char_index]='\0';//回溯
                                visit[i]=0;//回溯
                                result[--result_index]=0;//回溯
                            }else return 1;
                        }else return 1;
                    }else return 1;
                }else return 1;
            }
        }
        return 0;//找了4个都没找到或者全部数字用完
    }
}
int main() {
    int num[4]={0};
    char str[4][6]={0};
    scanf("%s %s %s %s",str[0],str[1],str[2],str[3]);
    int len;
    for(int i=0;i<4;i++){
        len=strlen(str[i]);
        if(len>2){
            printf("ERROR\n");
            return 0;
        }
        else{
            if(len==2) num[i]=10;
            else{
                if(str[i][0]>='2'&&str[i][0]<='9')
                num[i]=str[i][0]-'0';
                else{
                    switch (str[i][0]) {
                        case 'J':num[i]=11;break;
                        case 'Q':num[i]=12;break;
                        case 'K':num[i]=13;break;
                        case 'A':num[i]=1;break;
                    }
                }
            }
        }
    }
    //初始化结束,开始深搜
    for(int i=0;i<4;i++){
        result[0]=num[i];
        result_index++;
        visit[i]=1;
        if(dfs(num, num[i])==0){
            result_index--;
            result[0]=0;
            visit[i]=0;
        }else{//找到符合条件的第一个序列,做输出处理
            if(result[0]>=2&&result[0]<=9)
            printf("%c",result[0]+'0');
            else{
                switch (result[0]) {
                    case 1:printf("A");break;
                    case 10:printf("10");break;
                    case 11:printf("J");break;
                    case 12:printf("Q");break;
                    case 13:printf("K");break;
                }
            }
            for(int i=0;i<3;i++){
                printf("%c",cal_char[i]);
                if(result[i+1]>=2&&result[i+1]<=9)
                    printf("%c",result[i+1]+'0');
                else{
                    switch (result[i+1]) {
                        case 1:printf("A");break;
                        case 10:printf("10");break;
                        case 11:printf("J");break;
                        case 12:printf("Q");break;
                        case 13:printf("K");break;
                    }
                }
            }
            return 0;
        }
    }
    //没找到序列
    printf("NONE\n");
    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
04-02 18:53
继京东给外卖员缴纳五险一金之后,京东又发公告:达达员工逐步升级至20薪!这是从去年以来京东宣布第8次加薪。别说了,我现在就是东孝子!!
无助的缄默:20薪拿不满的,前5%拿20薪,后面还有18,16,15,14薪,相当于把低绩效的人的工资补给高绩效的人
投递京东等公司7个岗位 >
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务