dfs来address全排列问题

全排列
(1)思路:看看每个位置要发那个数st[i],用use[i]来看看是否被用过
算法(dfs):
1.写退出的条件
2.来枚举每一个数,看看有没有被用过,如果没有再放在相应的位置
3.回溯(记得物归原主)

题目练习链接:lhttps://www.luogu.com.cn/problem/P1706

ps:本题也可以用next_permutstion()函数------>#include

next_permutation(数组头地址,数组尾地址);若下一个排列存在,则返回真,如果不存在则返回假

next_permutation(st.begin(),str.end()) 对字符串进行排序

next_permutation(str.begin(),str.end())
#include 
#include 
#include 
#include 

using namespace std;
const int N=10010;
int use[N],st[N];
int n;

void dfs(int u)
{
	
	if(u>n)
	{
		for(int i=1;i<=n;i++)
		printf("%5d ",st[i]);
		printf("\n");
		return ;
	}
	
	for(int i=1;i<=n;i++)
	{
		if(!use[i])
		{
			st[u]=i;
			use[i]=true;
			dfs(u+1);
			st[u]=0;
			use[i]=false;			
		}
	}
	
}

int main()
{
	cin>>n;
	dfs(1);
	return 0;	
} 

 后续会发布一些相关题目

你可能感兴趣的:(c++,青少年编程)