题解 | #火车进站#

火车进站

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 云南

相关推荐

明天不下雨了:兄弟你是我今天看到的最好看的简历(我说的是简历风格跟简历书写)把985 211再搞亮一点。投boss就说;您好,我华科(985)研二在读,本科211。对您的岗位很感兴趣,希望能获得一次投递机会。
点赞 评论 收藏
分享
02-14 15:34
门头沟学院 Java
Java抽象带篮子:专业技能怎么写可以看看我发的帖子
点赞 评论 收藏
分享
评论
6
1
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客企业服务