7-1 输出全排列
分数 10
作者 DS课程组
单位 浙江大学
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a1,a2,⋯,an排在序列b1,b2,⋯,bn之前,如果存在k使得a1=b1,⋯,ak=bk 并且 ak+1<bk+1。
输入样例:
3
输出样例:
123
132
213
231
312
321
#include <bits/stdc++.h>
using namespace std;
void test(int n, int len); // n为最大数,len为当前路径长度
int path[9]; // 记录路径
int visted[10]; // 选取标记
int main() {
int n;
cin >> n;
test(n, 0); // 最大数为n,路径长度初始为0
}
void test(int n, int len) {
if (len == n) {
for (int i=0; i < n-1; i++) {
cout << path[i];
}
cout << path[n-1] << endl;
// 路径长度到n了,输出
} else {
for (int i=1; i <= n; i++) {
if (visted[i] == 0) {
path[len++] = i; // 如果i没有被选取过,就加进路径
visted[i] = 1; // 加紧路径后对i做标记
test(n, len); // 递归调用,路径长度不断增加,到n时输出然后逐层返回
len--; // 还原路径长度
visted[i] = 0; // 还原标记
}
}
}
}