描述
给定一个正整数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;
}