全排列问题是一种编程中常常出现的一个问题。
今天,我来给你们解析一下全排列的常见实现和底层实现。
首先,全排列的常见实现是用一个叫做next_permatition的封装函数。
废话不多说,直接看代码:
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int main()
{
int a[11];
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+n+1));
return 0;
}
这是简易的全排列代码,因为运用了next_permatition这个封装函数,把本来复杂的函数简化了。
接下来,我们来看一下全排列的底层实现。
#include<bits/stdc++.h>
using namespace std;
int a[100];
int n;
void swap(int a[],int j,int k);
void reverse(int a[],int j);
int find(int b[])
{
int j,k;
for(int i=1;i<=n;i++)
{
cout<<a[i];
if(i==n)
{
cout<<endl;
}
}
bool flag=1;
for(int i=n;i>=2;i--)
{
if(a[i-1]<a[i])
{
j=i-1;
break;
}
if(i==2)
{
flag=0;
}
}
if(flag==0)
{
return 0;
}
for(int i=n;i>=1;i--)
{
if(a[i]>a[j])
{
k=i;
break;
}
}
swap(a,j,k);
reverse(a,j+1);
return 1;
}
void swap(int a[],int j,int k)
{
int t;
t=a[j];
a[j]=a[k];
a[k]=t;
}
void reverse(int a[],int j)
{
int k=n;
while(j<k)
{
swap(a,j,k);
j++;
k--;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
a[i]=i;
}
while(1)
{
if(find(a)==0)
break;
}
return 0;
}
希望我的代码能对你们有用,有不对的地方请指出。谢谢。