知识点与难度
栈、中等难度
描述
给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号,火车站只有一个方向进出,同时停靠在火车站的列车中,只有后进站的出站了,先进站的才能出站。
要求输出所有火车出站的方案,以字典序排序输出。
数据范围:1≤n≤10
进阶:时间复杂度:O(n!) ,空间复杂度:O(n)
输入描述:
第一行输入一个正整数N(0 < N <= 10),第二行包括N个正整数,范围为1到10。
输出描述:
输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。
输入输出示例:
输入:
3
1 2 3
输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
我的代码:
#include <any>
#include <iostream>
#include <stack>
#include<algorithm>
using namespace std;
int n;
int array1[10] = {0};
int array2[10] = {0};
stack<int> station;
void Permutation() {
do {
int j = 0;
int key = 1;
int i = 0;
for (i = 0; i < n && key; i++) {
while (array2[i] != station.top()) {
if (j < n) {
station.emplace(array1[j]);
j++;
} else {
key = 0;
break;
}
}
station.pop();
}
station = stack<int>();
station.push(0);
if (i == n) {
for (int i = 0; i < n; i++) {
cout << array2[i] << " ";
}
cout << endl;
}
} while (next_permutation(array2, array2 + n ));
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> array1[i];
array2[i] = array1[i];
}
station.push(0);
sort(array2, array2 + n);
Permutation();
}
// 64 位输出请用 printf("%lld")
我的代码分析:
思路主要是:先求出火车数的全排列,全排列有两种做法,一种是递归算法,一种是字典序算法,详情见链接。这里我选择的字典序算法,字典序得出的结果不需要再进行排序,可直接输出。
(7条消息) 全排列的实现方法+字典序输出_DS_HY的博客-CSDN博客https://blog.csdn.net/sinat_36215255/article/details/78197129
解决完全排列问题后就简单了,比对每一种情况是否能出现,思路是:创建一个火车站栈station,比较数组元素与栈顶元素,若不同则火车进栈,若相同则火车出栈,数组移动到下一个元素比较,直到火车全部进栈,或全部出栈,并将能够出现的排列输出。
top1代码:
#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;
}
top1代码分析:
应该是用了一个深度优先搜索算法,具体没看懂。。。
总结:
实现全排列的方法有2种,一种是递归算法,一种是字典序算法。