洛谷上有一道题叫做全排列问题,是一道搜索题,正常情况大家会用深搜dfs的方法解这道题,代码如下:
#include<bits/stdc++.h>
int n,a[10],pp=1;
bool b[10];
using namespace std;
int print()
{
for(int i=1;i<=n;i++)
{
printf("%5d",a[i]);
}
printf("\n");
}
int search(int k)
{
for(int i=1;i<=n;i++)
{
if(!b[i])
{
b[i]=1;
a[pp]=i;
pp++;
if(k==n)
{
print();
}
else
{
search(k+1);
}
pp--;
b[i]=0;
}
}
}
int main()
{
scanf("%d",&n);
memset(b,0,sizeof(b));
search(1);
return 0;
}
但是,如果你想摸鱼的话,我们可以使用一个新的库函数next_permutation(),配合do-while循环就可以轻松获取全排列,就是时间会慢一些。
现在讲讲它的用法。
next_permutation()用来获取全排列更为轻松,但是它只有在数据升序排列时才可以应用,也就是说,在用它之前我们要先把数据sort一遍。
(1)正常数据
sort()+do-while()
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int num[3]={1,3,2};
sort(num,num+3);
do
{
for(int i=0;i<3;i++)
{
cout<<num[i]<<" ";
}
cout<<endl;
}
while(next_permutation(num,num+3));
return 0;
}
输出:
(2)结构体
结构体在正常情况下是不能比较大小的,需要自己写一个用来比较的cmp函数。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e6;
struct edge{
int pos,val;
}node[N];
bool cmp(edge x,edge y)
{
return x.val<y.val;
}
int main()
{
for(int i=1;i<=4;i++)
{
node[i].pos=i;
}
node[1].val=3;
node[2].val=4;
node[3].val=1;
node[4].val=2;
sort(node+1,node+4+1,cmp);
do
{
for(int i=1;i<=4;i++)
{
cout<<node[i].val<<" ";
}
cout<<endl;
}
while(next_permutation(node+1,node+4+1,cmp));
return 0;
}
输出:
(3)STL
vector是个好东西。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> v;
int main()
{
v.push_back(1);
v.push_back(3);
v.push_back(2);
sort(v.begin(),v.end());//vector数组不同于正常数组,放在函数里要写v.begin()和v.end()表示数组的首尾
do
{
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<" ";
}
cout<<endl;
}
while(next_permutation(v.begin(),v.end()));
return 0;
}
输出:
现在,你知道洛谷全排列问题应该怎么做了吧。
AC代码:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
using namespace std;
int a[10];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
a[i]=i;
}
do
{
for(int i=1;i<=n;i++)
{
cout<<setw(5)<<a[i];
}
cout<<endl;
}
while(next_permutation(a+1,a+n+1));
return 0;
}
结果: