题目描述
有 n 列火车按 1 到 n 的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。
进站的火车编号顺序为 1∼n,现在请你按火车编号从小到大的顺序,输出前 20 种可能的出站方案。
输入
输入一行一个整数 n。(n≤20)
输出
输出前 20 种答案,每行一种,不要空格。`
#include <stdio.h>
#define MAX 20
int s[MAX]={0};
int cnt_d=0;
int is_valid(int *a,int n){
int temp=1,cnt=-1;
int b[n]={0};
for(int i=0;i<n;i++){
if(a[i]>temp){
for(;temp<a[i];temp++){
cnt+=1;
b[cnt]=temp;
}
temp+=1;
}
else if(a[i]<temp){
if(cnt==-1) return 1;
if(a[i]==b[cnt]) cnt-=1;
else return 1;
}
else temp+=1;
}
if(cnt!=-1) return 1;
return 0;
}
void func(int *a,int m,int n){
if(cnt_d>=MAX) return ;
if(m>=n){
if(is_valid(a,n)) return;
for(int i=0;i<n;i++) printf("%d",a[i]);
printf(" %d\n",cnt_d);
cnt_d+=1;
return ;
}
for(int i=0;i<n;i++){
if(s[i]) continue;
a[m]=i+1;
s[i]=1;
func(a,m+1,n);
s[i]=0;
}
return ;
}
int main(void){
int n=0;
scanf("%d",&n);
int a[n]={0};
func(a,0,n);
return 0;
}