0
点赞
收藏
分享

微信扫一扫

94. 递归实现排列型枚举

天使魔鬼 2022-02-27 阅读 42

AcWing 94. 递归实现排列型枚举

把 1∼n1∼n 这 nn 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式

一个整数 nn。

输出格式

按照从小到大的顺序输出所有方案,每行 11 个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围

1≤n≤91≤n≤9

输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
难度:简单
时/空限制:5s / 256MB
总通过数:17461
总尝试数:22239
来源:《算法竞赛进阶指南》
算法标签

算法思想

以3为例:

做树状图,第一层一个,第二层分为3个,第三层每个分为2个,最后的叶子节点就是结果。

递归遍历,u从1开始,u从1到n,分别代表一层的数据结果。比如u在1开始,如果没有被遍历过,就加入到数组里面。然后在该数组现有的基础上进入下一层dfs(u+1);
for(int i=1;i<=n;i++)
	{
		if(!stn[i])
		{
			stn[i]=true;
			btn[u]=i;
			//cout<<btn[u]<<endl;
			dfs(u+1);
			stn[i]=false;
			
		}
	}

全部代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N=10;
int n;
int btn[N];
bool stn[N];

int dfs(int u)
{
	if(u>n)
	{
		for(int i=1;i<=n;i++)
		{
			cout<<btn[i]<<" ";
		}
		cout<<endl;
		return 0;
	}
	else
	for(int i=1;i<=n;i++)
	{
		if(!stn[i])
		{
			stn[i]=true;
			btn[u]=i;
			//cout<<btn[u]<<endl;
			dfs(u+1);
			stn[i]=false;
			
		}
	}
}
int main()
{
	cin>>n;
	dfs(1);
	return 0;
}

来自:

https://www.acwing.com/problem/content/96/

举报

相关推荐

0 条评论