题解 | #火车进站#

火车进站

http://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109

同时存在两种可能的情况时,递归实现需要在每一种情况递归出来后,做好回溯处理。

#include <stdio.h>
#include <string.h>

int N;
int train[10] = {0};
int in_train[10] = {0};
int out_train[10] = {0};
char res[60000][10] = {0};
int kind = 0;

int cmp(void *a, void *b)
{
    return strcmp((char *)a, (char *)b); 
}

void DFS(int in_num, int out_num, int index)
{
    if (out_num == N) {
        for (int i = 0; i < N; i++) {
            res[kind][i] = out_train[i] + '0';
        }
        kind++;
        //printf("RETURN: in_num=%d, out_num=%d, index=%d, kind=%d\n", in_num, out_num, index, kind);
        return;
    }
    
    // 进站
    if (index < N) {
        in_train[++in_num] = train[index++];
        //printf("IN: in_num=%d, out_num=%d, index=%d, in=%d\n", in_num, out_num, index, in_train[in_num - 1]);
        DFS(in_num, out_num, index);
        in_num--;
        index--;
    }
    
    // 出站
    if (in_num >= 0) {
        out_train[out_num++] = in_train[in_num--];
        //printf("OUT: in_num=%d, out_num=%d, index=%d, out=%d\n", in_num, out_num, index, in_train[in_num + 1]);
        DFS(in_num, out_num, index);
        in_train[++in_num] = out_train[--out_num];
    }
}

int main(void)
{
    scanf("%d", &N);
    for (int i = 0; i < N; i++) {
        scanf("%d", &train[i]);
    }
    
    DFS(-1, 0, 0);
    
    qsort(res, kind, sizeof(res[0]), cmp);
    
    //printf("%d\n", kind);
    for (int i = 0; i < kind; i++) {
        for (int j = 0; j < N; j++) {
            printf("%c ", res[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}
全部评论
请问第41行是为了回溯嘛?不太理解,求指点
1 回复 分享
发布于 2022-12-27 15:31 浙江
第41行是为了回溯,但是里面包含两层回溯的概念。 一是,计数器本身的回溯; 而是,站内火车的回溯。 为啥有第二条回溯呢?我理解的是,单纯回溯计数器还是不够的,因为“出站”不同于“进站”,只是单纯回溯计数器的话,下一次迭代还会重复这个过程;“进站”已经遍历完或者条件不满足时,才会执行“出站程序”部分,如果出站条件不满足,则需要把前一次已经出站的火车重新退回到站内,再进行后面的迭代遍历。 不知道我理解的对不对,还请楼主斧正!
1 回复 分享
发布于 2023-06-12 23:13 云南

相关推荐

目前感觉简历还有很多问题,希望各位能不吝赐教以及非常感谢这位老哥——@黑皮白袜臭脚体育生&nbsp;的项目,学完一遍感觉受益颇丰
小菜鸡只想转正:校友,我的建议是冗余的最好去掉,突出重点,比如985,211双一流的提示,专业技能调整到个人项目之后的位置。专业技能感觉写的太细了?占用篇幅最好腾出一点给项目经历,如果没写手机号和邮箱,记得加上。
点赞 评论 收藏
分享
01-18 09:26
已编辑
门头沟学院 Java
王桑的大offer:建议中间件那块写熟悉即可,写掌握 面试包被拷打到昏厥
点赞 评论 收藏
分享
02-12 17:30
已编辑
字节跳动_实习生(实习员工)
要怎么办呢牛:我觉得大厂日常实习最大的意义就是给自己背书,一个好公司的实习就像一个好学历似的,能够给自己增加一个标签,让别人觉得你可以。(至于真正实习干了啥,这个感觉并不太重要)。当然一家之言,仅供参考。另外,楼主已经很强了,实习毕业双双拿下,已经领先好多好多人了,羡慕啊
点赞 评论 收藏
分享
评论
6
1
分享

创作者周榜

更多
牛客网
牛客企业服务