题解 | #火车进站#

火车进站

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

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

static int sortSeq(const void *a, const void *b)
{
    return strcmp((char *)a, (char *)b);
}

static char g_stack[3][11] = {0}; /* 0,1,2 分别对应未入火车站的火车队列,在火车站中的火车队列,以及出栈后的火车队列 */
static char g_seq[5000][11] = {0};
static int g_num, g_kind = 0;
static void HandleSeq(char idx0, char idx1, char idx2, char in)
{
    if (in) { /* 不为 0 表示进入火车站 */
        if (idx0 >= g_num) return;
        g_stack[1][++idx1] = g_stack[0][idx0++];
        HandleSeq(idx0, idx1, idx2, 0);
        g_stack[1][idx1] = g_stack[0][idx0 - 1];
        HandleSeq(idx0, idx1, idx2, 1);
    } else { /* 当前最后入火车站的火车出战 */
        if (idx2 >= g_num) { strcpy(g_seq[g_kind++], g_stack[2]); return; }
        if (idx1 < 0) return;
        g_stack[2][idx2++] = g_stack[1][idx1--];
        HandleSeq(idx0, idx1, idx2, 0);
        HandleSeq(idx0, idx1, idx2, 1);
        g_stack[1][idx1 + 1] = g_stack[2][idx2 - 1];
    }
}

int main(int argc, char** argv)
{
    scanf("%d", &g_num);
    for (int i = 0; i < g_num; i++) scanf("%hhd", &g_stack[0][i]);
    HandleSeq(0, -1, 0, 1);
    qsort(g_seq, g_kind, sizeof(g_seq[0]), sortSeq);
    for (int i = 0; i < g_kind; i++) {for (int j = 0; j < g_num; j++) {printf("%d ", g_seq[i][j]);} printf("\n");}
    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 14:35
点赞 评论 收藏
分享
05-26 10:24
门头沟学院 Java
qq乃乃好喝到咩噗茶:其实是对的,线上面试容易被人当野怪刷了
找工作时遇到的神仙HR
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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