题目描述
给定一个正整数n(1≤n≤9),请你按字典序输出由1到n组成的所有全排列,每行输出一个排列。
输入格式
一个整数n。
输出格式
按字典序输出所有由1到n组成的全排列,每行一个排列,数字之间用空格分隔。
输入
3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include <bits/stdc++.h>
using namespace std;
int flag[15]; // 标记数组,用于记录当前数字是否已被使用
int a[15]; // 存储当前排列的结果
int n; // 输入的正整数n
// 函数pt:打印当前排列
void pt() {
for (int i = 1; i <= n; i++) { // 遍历排列中的每一个数字并输出
cout << a[i] << " "; // 输出第i个位置上的数字
}
cout << endl; // 每完成一个排列后换行
return;
}
// 函数f:递归成全排列
void f(int w) {
if (w == n + 1) { // 如果当前位置w等于n+1,说明已经填满了一个完整的排列
pt(); // 调用pt函数打印这个排列
return; // 结束本次递归
}
for (int i = 1; i <= n; i++) { // 枚举从1到n的所有可能数字
if (flag[i] != 0) continue; // 如果当前数字已经被使用过,则跳过此次循环
flag[i] = 1; // 标记当前数字为已使用
a[w] = i; // 将当前数字放入排列的第w个位置
f(w + 1); // 递归进入下一层次,尝试填充下一个位置
flag[i] = 0; // 回溯:恢复当前数字的状态为未使用
a[w] = 0; // 清除当前排列位置的内容以便重新尝试其他可能性
}
}
int main() {
cin >> n; // 从用户输入获取正整数n
f(1); // 调用f函数开始生成全排列,初始位置设为1
return 0; // 程序正常结束
}