HJ77 火车进站(不会,重点复习)

描述
给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号,火车站只有一个方向进出,同时停靠在火车站的列车中,只有后进站的出站了,先进站的才能出站。
要求输出所有火车出站的方案,以字典序排序输出。
输入描述:
有多组测试用例,每一组第一行输入一个正整数N(0

输出描述:
输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。

示例1
输入:
3
1 2 3
复制
输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1

说明:
第一种方案:1进、1出、2进、2出、3进、3出
第二种方案:1进、1出、2进、3进、3出、2出
第三种方案:1进、2进、2出、1出、3进、3出
第四种方案:1进、2进、2出、3进、3出、1出
第五种方案:1进、2进、3进、3出、2出、1出
请注意,[3,1,2]这个序列是不可能实现的。 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_N 10
char result[12000][12];
int result_cnt;
int stack1[MAX_N];
int index1;
int stack2[MAX_N];
int index2;
int stack3[MAX_N];
int index3;
int size;

void dfs(){
    if(index3==size){
        int i;
        for(i=0;i<size;i++)
            result[result_cnt][i]=stack3[i]+'0';
        result[result_cnt][i]='\0';
        result_cnt++;
        return;
    }
    if(index2!=-1){//站内有车
        stack3[index3]=stack2[index2];
        index3++;
        index2--;
        dfs();
        stack2[++index2]=stack3[--index3];
    }
    if(index1<size){
        stack2[++index2]=stack1[index1];
        index1++;
        dfs();
        index2--;
        index1--;
    }
}
int comp(const void *a,const void *b){
    return strcmp((char*)a,(char*)b);
}

int main(){
    while(scanf("%d",&size)!=EOF){
        int i,j;
        for(i=0;i<size;i++){
            scanf("%d",&stack1[i]);
        }
        index1=0;
        index2=-1;
        index3=0;
        result_cnt=0;
        dfs();
        qsort(result,result_cnt,sizeof(result[0]),comp);
        for(i=0;i<result_cnt;i++){
            for(j=0;j<size;j++){
                printf("%c ",result[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
#include <stdio.h>
#include <stdlib.h>

#if 0
#define dbg printf
#else
#define dbg 
#endif

void calcu(int len, int cur, int *stack, int *outbuf)
{
    int i, j;
    int *tmp_stack, *tmp_outbuf;
    
    if(cur == len)
    {
        i = 0;
        while(outbuf[i] != 0)
        {
            dbg("(%d):", __LINE__);
            printf("%d ", outbuf[i]);
            i++;
        }
        i = 0;
        while(stack[i] != 0)
        {
            i++;
        }
        if(i > 0)
        {
            i--;
            while(i >= 0)
            {
                dbg("(%d):", __LINE__);
                printf("%d ", stack[i]);
                i--;
            }
        }
        dbg("(%d):end", __LINE__);
        printf("\n");
    }
    else if(cur == len-1)
    {
        tmp_stack = (int *)calloc(len, sizeof(int));
        i = 0;
        while(stack[i] != 0)
        {
            tmp_stack[i] = stack[i];
            i++;
        }
        tmp_stack[i] = cur+1;
        calcu(len, 1+cur, tmp_stack, outbuf);
        free(tmp_stack);
    }
    else
    {
        tmp_stack = (int *)calloc(len, sizeof(int));
        tmp_outbuf = (int *)calloc(len, sizeof(int));
        i = 0;
        while(outbuf[i] != 0)
        {
            tmp_outbuf[i] = outbuf[i];
            i++;
        }
        tmp_outbuf[i] = cur+1;
        calcu(len, 1+cur, stack, tmp_outbuf);
        i = 0;
        while(stack[i] != 0)
        {
            tmp_stack[i] = stack[i];
            i++;
        }
        tmp_stack[i] = cur+1;
        calcu(len, 1+cur, tmp_stack, outbuf);
        free(tmp_stack);
        free(tmp_outbuf);
    }
}

int main(void)
{
    int *array;
    int *stack;
    int *outbuf;
    int num;
    int i;
    
    while(scanf("%d", &num) != EOF)
    {
        array = (int *)calloc(num, sizeof(int));
        stack = (int *)calloc(num, sizeof(int));
        outbuf = (int *)calloc(num, sizeof(int));
        for(i=0; i<num; i++)
        {
            scanf("%d", array+i);
        }
        calcu(num, 0, stack, outbuf);
        free(array);
        free(stack);
        free(outbuf);
    }
    
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值