版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目描述(来源:力扣(LeetCode))
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路解答
典型的DFS或者回溯算法的运用,也类似于八皇后问题
代码详解
#include<iostream>
#include<cstring>
using namespace std;
#define Maxsize 1000
int n, visited[Maxsize];
int count;
int parent[Maxsize];
void Recall(int *, int, int);//回溯函数
int main()
{
int num[Maxsize], i;
cin >> n;//输入项数
for (i = 1; i <= n; i++)
cin >> num[i];
memset(parent,0,sizeof(int)*(n + 1));//初始化
memset(visited,0,sizeof(int)*(n + 1));
Recall(num, 1, 0);//调用递归函数
cout << "一共有" << count << "种全排列" << endl;
return 0;
}
void Recall(int num[], int i, int cnt)
{
int v, w;
if (cnt == n)//全部排列进去后,结束该层递归
{
count++;//种类累计变量
for (w = 1; w <= n; w++)//输出该次排列元素
cout << parent[w] << " ";
cout << endl;
return;
}
for (v = 1; v <= n; v++)
{
if (visited[v] == 0)//没有被访问过
{
parent[++cnt] = num[v];//进入排列
visited[v] = 1;//标记已访问
Recall(num, v, cnt);//递归下一层
visited[v] = 0;//上述递归完成后,回溯
cnt--;//消去上层递归已进入元素
}
}
}
运行结果