第一行输入一个整数
代表火车的数量。
第二行输入
个整数
代表火车的入站顺序。
输出若干行,每行输出
个整数,代表一种出站顺序。你需要按照字典序从小到大依次输出。
3 1 2 3
1 2 3 1 3 2 2 1 3 2 3 1 3 2 1
在这个样例中,每一种出栈顺序的详细出入站状况为(黑色普通字体代表入站、橙色加粗字体代表出站):
;
;
;
;
。
#include <stdio.h> int num_seq[10]; int use[10]={0}; int b[10]; //数组b,传入火车序号,得到火车位置(从1开始) int f2(int n,int loc_seq[]){ // f2()判断入站序列(实际位置序列)是否合法 int st[n]; int top=-1,i,max=0; for(i=0; i<n; i++){ if(top==-1||loc_seq[i]>st[top]){ for(int j=max+1; j<loc_seq[i]; j++) st[++top]=j; max=loc_seq[i]; } else if(st[top]==loc_seq[i]) top--; else return 0; } return 1; } void f3(int n,int loc_seq[]){ for(int i=0; i<n; i++) loc_seq[i]=b[num_seq[i]]; } void f1(int n,int pos){ if(pos==n) { int loc_seq[n]; f3(n,loc_seq); if(f2(n,loc_seq)) { for (int i = 0; i < n; i++) printf("%d ", num_seq[i]); printf("\n"); } return; } for(int i=0; i<n ;i++){ if(use[i]) continue; use[i]=1; num_seq[pos]=i+1; f1(n,pos+1); use[i]=0; } } int main() { int n,tmp; scanf("%d",&n); for(int i=0; i<n; i++){ scanf("%d",&tmp); b[tmp]=i+1; } //首先实现全排列,用函数f1() f1(n,0); return 0; } 写了第二遍才写好