题解 | #24点运算#

24点运算

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

dfs算法
#include<stdio.h>
#include<string.h>

char str[10][10] = { 0 };
int a[10] = { 0 };
int b[10] = { 0 };
int v[10] = { 0 };
int his[10] = { 0 };
char syms[10] = { 0 };
int flag2 = 0;
int dfs1(int i, int sum)
{
    if (i == 3)
    {
        if (sum == 24) { return 1; }
        else { return 0; }
    }
    int ti = i + 1;
    if (ti <= 3 && ti >= 0 && his[ti] == 0)
    {
        his[ti] = 1;
        if (dfs1(ti, sum + b[ti]) == 1) { syms[ti] = '+'; return 1; }
        else { his[ti] = 0; }
    }
    if (ti <= 3 && ti >= 0 && his[ti] == 0)
    {
        his[ti] = 1;

        if (dfs1(ti, sum - b[ti]) == 1) { syms[ti] = '-'; return 1; }
        else { his[ti] = 0; }
    }
    if (ti <= 3 && ti >= 0 && his[ti] == 0)
    {
        his[ti] = 1;
        if (dfs1(ti, sum * b[ti]) == 1) { syms[ti] = '*'; return 1; }
        else { his[ti] = 0; }
    }
    if (ti <= 3 && ti >= 0 && his[ti] == 0)
    {
        his[ti] = 1;
        if (dfs1(ti, sum / b[ti]) == 1) { syms[ti] = '/'; return 1; }
        else { his[ti] = 0; }
    }
    return 0;
}

void dfs2(int i)//i表示树层
{
    if (i >= 4)
    {
        his[0] = 1;
        if (dfs1(0, b[0]) == 1)
        {
            flag2 = 1;
            for (int m = 0; m < 4; m++)
            {
                if (b[m] > 1 && b[m] <= 9) { str[m][0] = b[m] + '0'; }
                if (b[m] == 10) { strcpy(str[m], "10"); }
                if (b[m] == 1) { str[m][0] = 'A'; }
                if (b[m] == 11) { str[m][0] = 'J'; }
                if (b[m] == 12) { str[m][0] = 'Q'; }
                if (b[m] == 13) { str[m][0] = 'K'; }
            }
            printf("%s%c%s%c%s%c%s", str[0], syms[1], str[1], syms[2], str[2], syms[3], str[3]);
        }
        return;
    }
    for (int k = 0; k < 4; k++)//k表示树枝
    {
        if (a[k] == a[k - 1] && v[k - 1] == 1 && k > 1)
        {
            continue;
        }
        if (v[k] == 0)
        {
            v[k] = 1;
            b[i] = a[k];
            dfs2(i + 1);
            v[k] = 0;
        }
    }
}

int main(void)
{
    int flag = 0;
    for (int i = 0; i < 4; i++)
    {
        scanf("%s", str[i]);
        if (strlen(str[i]) > 2) { flag = 1; printf("ERROR"); }
        if (str[i][0] >= '2' && str[i][0] <= '9')
        {
            a[i] = str[i][0] - '0';
        }
        if (strcmp(str[i], "10") == 0)
        {
            a[i] = 10;
        }
        if (str[i][0] == 'A') { a[i] = 1; }
        if (str[i][0] == 'J') { a[i] = 11; }
        if (str[i][0] == 'Q') { a[i] = 12; }
        if (str[i][0] == 'K') { a[i] = 13; }
    }//输入完毕
    //求全排列
    if (flag == 0)
    {
        //先排序
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4 - 1 - i; j++)
            {
                if (a[j] > a[j + 1])
                {
                    int temp;
                    temp = a[j + 1];
                    a[j + 1] = a[j];
                    a[j] = temp;
                }
            }
        }//排序完毕
        //printf("%d %d %d %d",a[0],a[1],a[2],a[3]);
        dfs2(0);//全排列
        if (flag2 == 0) { printf("NONE"); }
    }
    return 0;
}


全部评论

相关推荐

“无名小卒,还是名扬天下?”我知道很多人都不觉得我能走到今天这一步,当然,也包括我自己。在我的人生里,有两部作品刻下了最深的烙印:《斗破苍穹》与《龙族》。它们总被人拿来对照:一边是萧炎的桀骜轻狂,一边是路明非的怯懦衰颓。有人说,天蚕土豆没见过魂天帝,但江南见过真凯撒。我时常觉得,自己就是那个衰小孩路明非。可路明非可以开挂,我不可以;我也无数次幻想过,能拥有萧炎那般年少轻狂的人生,可我没有他与生俱来的逆天天赋。我只是个平庸的普通人,一个看过《斗破苍穹》却开不了挂的路明非,只能一步一步往上爬。从我下定决心找实习的那一刻起,我就给自己定下了目标:“我一定要为字节跳动卖命.jpg”。萧炎有他的三年之约,我有我的两年半之约(其实是一年半)。2024.11.20,科大讯飞的第一封实习offer落进邮箱,我迈出了这场奔赴的第一步。2025.8.18,放弃百度转正的安稳机会,转身走进前路未卜的不确定里。2025.11.14,我选择走进字节跳动,以实习生的身份重新出发。2026.3.25&nbsp;-&nbsp;3.31,一周速通上海飞书,幸遇赏识我的伯乐,斩获Special&nbsp;Offer。被告知面试通过的那一刻,我的内心无比平静,就像这个offer本就该属于我。不是侥幸,是应得的。这一路,有人看轻过我的出身,不相信我能走到这里;也有人在我看不见前路的时候,替我举过灯。没有他们的鼓励与支撑,就没有今天站在这里的我。我看到了自强不息的激荡,那是一个双非的伟大乐章!我是雨夜迈巴赫,我要开启属于我的新篇章了。
在看牛客的本杰明很勇...:真心祝贺l总 我永远的偶像 我滴神
春招至今,你收到几个面试...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务