题目描述
把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入格式
一个整数n。
输出格式
按照从小到大的顺序输出所有方案,每行1个。
首先,同一行相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。
数据范围
1≤n≤9
算法1
(递归)
排列问题和选择问题,在于排列问题每个位置都得填数,所以需要用一个vis数组标记以前是否选过.
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
bool vis[N];
int arr[N];
int n;
//从[idx, n]考虑idx位置放谁?
void dfs(int idx) {
if (idx == n + 1) { //放满了
for (int i = 1; i <= n; ++ i)
cout << arr[i] << " ";
cout << endl;
return ;
}
//第idx位置,可以放[1, n]种任意一个。
for (int i = 1; i <= n;++ i) {
if (!vis[i]) {
vis[i] = true;
arr[idx] = i;
dfs(idx + 1);
vis[i] = false;
}
}
}
int main() {
cin >> n;
dfs(1);
return 0;
}