题目:给出1~n个数求它们的全排列
思路:dfs, n个数深搜n层。如果dfs(0),那就到n就return结束,dfs(1),那么就到n+1结束.
代码:
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
vector <int>ans;
int n;
void show(){
for(int i=0;i<ans.size();i++){
printf("%5d",ans[i]);
}
putchar('\n');
return;
}
int vis[12];
void dfs(int num){
if(num==n+1){
show();
return;
}
for(int i=1;i<=n;i++){ //1~n个选择
if(!vis[i]){
ans.push_back(i);
vis[i]=1;
dfs(num+1);
ans.pop_back();
vis[i]=0;
}
}
}
int main(){
cin>>n;
dfs(1); //代表当前搜索的层数
return 0;
}
更简洁的代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+5;
int n;
int path[N];
bool st[N];
void dfs(int u){
if(u==n){
for(int i=0;i<n;i++) printf("%d ",path[i]);
puts("");
return;
}
for(int i=1;i<=n;i++){
if(!st[i]){
st[i]=1;
path[u]=i;
dfs(u+1);
st[i]=0;
path[i]=0;
}
}
}
int main(){
cin>>n;
dfs(0);
return 0;
}
利用全排列函数:next_permutation(a,a+n);
next_permutation(a,a+n)能够将一组数据,从最小的字典序,变化到最大的字典序;
//从最小的字典序开始,依次往后加;
//事实上原数组并没有发生变化
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int a[3] = {2,3,1};
sort(a,a+3);
do {
for(int i=0;i<3;i++)
cout << a[i] << " ";
cout << endl;
}while(next_permutation(a,a+3));
}