库函数next_permutation()

洛谷上有一道题叫做全排列问题,是一道搜索题,正常情况大家会用深搜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;
}

结果:

完结

posted @ 2024-04-24 21:02  zky2023  阅读(8)  评论(1编辑  收藏  举报