题解 | #火车进站#

火车进站

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 回复 分享
发布于 2023-06-12 23:13 云南
请问第41行是为了回溯嘛?不太理解,求指点
1 回复 分享
发布于 2022-12-27 15:31 浙江

相关推荐

不愿透露姓名的神秘牛友
07-24 13:35
点赞 评论 收藏
分享
仁者伍敌:牛子这些人还会点一个自动回复,boss都不带回复的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-21 13:38
8月实习会变多吗现在还没找到实习该怎么办...回复的hr好少
码农索隆:3-4月就要开始找,基本上6月份就发offer,7月初已经开始暑期实习了。
点赞 评论 收藏
分享
评论
6
1
分享

创作者周榜

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