输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入第一行为一个整数n
输出由 1 至 n 组成的所有不重复的数字序列,每行一个序列。
每个数字之间由空格隔开
样例输入 13样例输出 1
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1提示
1 ≤ n ≤ 9 1 le n le 9 1≤n≤9
实现思路通过深度优先搜索。
首先,设置暂时存放值的 arr 数组和 用来判断数字是否遍历过的 visited 数组。
初始化 visited 数组后,从 1 开始 dfs(dfs 的形参 num 代表第几个数)。
- 对于每一次 dfs() ,
- 如果 num 已经超过 n ,则对 arr 进行输出后返回;
- 没有超过 n 时,进行从 1 到 n 的遍历,寻找没有被遍历过的数字。循环中,如果 i 未被访问过,
- 则将 i 存至 arr ,并将 visited[i - 1] 设为 true,随后再进行 dfs;
- 回溯时,将回溯时,将 i 出栈,visited[i - 1] 重新设为 false。
#include暑期编程PK赛 得CSDN机械键盘等精美礼品!#include using namespace std; int n; vector arr; vector visited; void print() { for (auto i : arr) { cout << i << ' '; } cout << endl; } // dfs 深搜,num 代表第几个数字 void dfs(int num) { if (num > n) { // 已经超过 n 个数了,输出并返回即可 print(); return ; } for (int i = 1; i <= n; i++) { if (visited[i - 1]) { // 已访问过,继续下一个 continue; } // 未访问过,将 i 入 arr,并将 visited[i - 1]设为 true arr.push_back(i); visited[i - 1] = true; dfs(num + 1); // 回溯时,将 i 出栈,visited[i - 1] 重新设为 false arr.pop_back(); visited[i - 1] = false; } } int main() { cin >> n; // 初始化 visited 数组 visited = vector (n, false); dfs(1); return 0; }



