题目描述
有 n 列火车按 1 到 n 的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。
进站的火车编号顺序为 1∼n,现在请你按火车编号从小到大的顺序,输出前 20 种可能的出站方案。
输入
输入一行一个整数 n。(n≤20)
输出
输出前 20 种答案,每行一种,不要空格。
样例输入1
3
样例输出1
123
132
213
231
321
样例输入2
4
样例输出2
1234
1243
1324
1342
1432
2134
2143
2314
2341
2431
3214
3241
3421
4321
数据规模与约定
时间限制:1 s
内存限制:256 M
100% 的数据保证 n≤20
#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
stack<int> s;
int arr[25],cnt = 20;
int is_valid(int* arr, int n) {
int temp = 0;
for (int i = 0; i < n; i++) {
while (temp < arr[i]) {
s.push(++temp);
}
if (s.top() != arr[i]) {
return 0;
}
s.pop();
}
return 1;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) arr[i] = i + 1;
do {
if (is_valid(arr, n)) {
for (int i = 0; i < n; i++) {
cout << arr[i];
}
cout << endl;
cnt--;
}
} while (next_permutation(arr, arr + n) && cnt);
return 0;
}