STL风格全排列
#include<bits/stdc++.h>
using namespace std;
const int N=10;
int a[N];
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
a[i]=i;
}
do
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}while(next_permutation(a+1,a+1+n));
return 0;
}
代码随想录风格全排列
用一个used数组打标记去重:
#include<bits/stdc++.h>
using namespace std;
int n;
vector<vector<int>>vv;
vector<int>v;
void dfs(vector<bool>& used)
{
if(v.size()==n)
{
vv.push_back(v);
return;
}
//单层搜索逻辑
for(int i=1;i<=n;i++)
{
if(used[i]==true)continue; //已经取过的不能再取了
v.push_back(i);
used[i]=true;
dfs(used);
v.pop_back();
used[i]=false;
}
}
int main()
{
cin>>n;
vector<bool>used(n,false);
dfs(used);
for(auto it:vv)
{
for(auto num:it)
{
cout<<num<<" ";
}cout<<endl;
}
return 0;
}
yxc风格全排列
#include<bits/stdc++.h>
using namespace std;
const int N=10;
int st[N],path[N];
int n;
void dfs(int u)
{
if(u==n)
{
for(int i=0;i<n;i++)printf("%d ",path[i]);
printf("\n");
}
for(int i=1;i<=n;i++)
{
if(!st[i])
{
path[u]=i;
st[i]=true;
dfs(u+1);
st[i]=false; //回溯
}
}
}
int main()
{
cin>>n;
dfs(0);
return 0;
}
九元学长风格全排列
#include<bits/stdc++.h>
using namespace std;
int n;
const int N=10;
int a[N];
bool vis[N+1];
void f(int k)
{
if (k == n) {
for (int i = 1; i <= n; i++) {
cout << a[i] << " ";
}
cout << endl;
return;
}
for(int i=k;i<=n;i++)
{
if(!vis[i])
{
{int t=a[k];a[k]=a[i];a[i]=t;}
f(k+1);
{int t=a[k];a[k]=a[i];a[i]=t;}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
a[i]=i;
}
f(1);
return 0;
}