#include<iostream>
#include<cstdio>
using namespace std;
int n;
int vis[20];//标记数组,vis[i]记录 i 是否被使用过
int a[20];//用来记录依次使用的数字
void pr() {
for (int i = 1;i <= n;i++) printf("%5d", a[i]);//见到的搜索好多用从 1 开头的 for 循环了!
//注意题目要求:每个数字占五个场宽
cout << endl;
}
//多写几次,熟悉算法思想与套路,一次是远远不够的!(dsf 用递归也即栈的思想)
void dfs(int x) {
if (x > n) pr();//全部遍历结束就输出
//遍历所有数字,寻找未被使用过的数字
for (int i = 1;i <= n;i++) {
if (vis[i] == 0) {
vis[i] = 1;//别忘了标记该数字!
a[x] = i;//记录第 x 层的数字
dfs(x + 1);//搜索下一层
vis[i] = 0;//返回时消去对该数字的标记!
}
}
}
int main() {
cin >> n;
dfs(1);
return 0;
}
全排列问题
于 2021-06-05 23:38:47 首次发布