全排列 1

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44116998/article/details/101982578

题目描述来源:力扣(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--;//消去上层递归已进入元素 
		}
	}
}

运行结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/101982578