一文吃透全排列

理解什么是全排列?

我们一般把1~n这n个整数按某个顺序摆放的结果称为这n个整数的一个排列,而全排列指这n个整数能形成的所有排列
例如对1、2、3这三个整数来说
它的全排列是:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

三个整数的全排列用手很快就能无差错的列举出来,那当是10个、100个时呢?

下面我们用程序来实现全排列

方法一:递归

#include <bits/stdc++.h>
using namespace std;
int n;
int res[10001], vis[10001];

void dfs(int step){
    
    
	if(step == n+1){
    
    
		for(int i = 1; i <= n; i++){
    
    
			cout<<res[i]<<' ';
		}
		cout<<endl;
		return;
	}
	for(int i = 1; i <= n; i++){
    
    
		if(!vis[i]){
    
    
			vis[i] = 1;
			res[step] = i;
			dfs(step+1);
			vis[i] = 0;
		}
	}
}

int main(){
    
    
	cin>>n;
	memset(res, 0, sizeof(res));
	memset(vis, 0, sizeof(vis));
	dfs(1);
	return 0;
} 

方法二:借助C++ STL全排列函数

#include <bits/stdc++.h> 
using namespace std;
int main(){
    
    
	int n;
	cin>>n;
	int s[10001];
	for(int i = 0; i < n; i++){
    
    
		s[i] = i+1;
	}
	do{
    
    
		for(int i = 0; i < n; i++){
    
    
			cout<<s[i]<<' ';
		}
		cout<<endl;
	}while(next_permutation(s, s+n));
	return 0;
}

理解全排列对我们学习递归、后续解决很多类似枚举、穷举的问题有很大帮助

出顾茅庐,欢迎指点,感谢支持!

猜你喜欢

转载自blog.csdn.net/weixin_44723496/article/details/109023783