首页 > 其他分享 >库函数next_permutation()

库函数next_permutation()

时间:2024-04-24 21:14:38浏览次数:28  
标签:std do int namespace next permutation using include 库函数

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

结果:

完结

标签:std,do,int,namespace,next,permutation,using,include,库函数
From: https://www.cnblogs.com/dqsj19312/p/18156359

相关文章

  • HarmonyOS NEXT 实战开发—Grid和List内拖拽交换子组件位置
    介绍本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。效果图预览使用说明:拖拽Grid中子组件,到目标Grid子组件位置,进行两者位置互换。拖拽List中子组件,到目标List子组件位置,进行两者位置互换。实现思路在Grid组件中,通过editMode()打......
  • Nuxtjs如果使用useHead()导入swiper,除了在onMounted调用,切换报错前面使用 await next
     注意:awaitnextTick();如果没用,vue切换的时候可能有问题<scriptlang="ts"setup>import{DArrowRight}from"@element-plus/icons-vue";useHead({script:[{src:"/script/swiper.js",},],link:[{......
  • HarmonyOS NEXT应用开发实战—组件堆叠
    介绍本示例介绍运用Stack组件以构建多层次堆叠的视觉效果。通过绑定Scroll组件的onScroll滚动事件回调函数,精准捕获滚动动作的发生。当滚动时,实时地调节组件的透明度、高度等属性,从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组件切换。效果图预览使用说明加载完成......
  • HarmonyOS NEXT应用开发—城市选择案例
    介绍本示例介绍城市选择场景的使用:通过AlphabetIndexer实现首字母快速定位城市的索引条导航。效果图预览使用说明分两个功能在搜索框中可以根据城市拼音模糊搜索出相近的城市,例如输入"a",会出现"阿尔山"、"阿勒泰地区"、"安庆"、"安阳"。下方城市列表通过AlphabetIndexer组......
  • HarmonyOS NEXT应用开发—听歌识曲水波纹特效案例
    介绍在很多应用中,会出现点击按钮出现水波纹的特效。效果图预览使用说明进入页面,点击按钮,触发水波纹动画。再次点击按钮,停止水波纹动画。实现思路本例涉及的关键特性和实现方案如下:要实现存在两个连续的涟漪,需要两个层叠的Stack分别以一定延迟进行相同的动画。源码参考......
  • Web3开发者技术选型:前端视角(next.js)
    引言在现代Web开发的世界中,Web3技术的兴起为前端开发者开辟了新的可能性。Web3技术主要指的是建立在区块链基础上的分布式网络,使用户能够通过智能合约和去中心化应用(DApps)直接交互,而无需传统的中介机构。为了有效地开发Web3应用,前端开发者需要掌握一些关键的技术和工具,其中Next.j......
  • HarmonyOS NEXT应用开发案例—状态栏显隐变化
    介绍本示例介绍使用Scroll组件的滚动事件 onScroll 实现状态栏显隐变化。该场景多用于各种软件的首页、我的等页面中。效果预览图使用说明加载完成后显示状态栏显隐变化页面,上下拖动屏幕,顶端状态栏出现显隐变化。实现思路在置顶位置使用stack组件添加两层状态栏。源......
  • E. Klever Permutation
    链接:https://codeforces.com/problemset/problem/1927/E思路:观察,可知每隔k个数据就是+1/-1,且间隔而分,思路如下:然后按顺序打表就行代码:#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#includ......
  • HarmonyOS NEXT应用开发案例—自定义日历选择器
    介绍本示例介绍通过CustomDialogController类显示自定义日历选择器。效果图预览使用说明加载完成后显示主界面,点当前日期后会弹出日历选择器,选择日期后会关闭弹窗,主页面日期会变成选定的日期。实现思路获取当前月和下个月的日期信息。源码参考GetDate.ets。constSATU......
  • Next-Auth 源码解析
    Next-Auth源码解析简单介绍一下Next-Auth源码的结构目录简介我们看packages/next-auth/src,这个目录下面是根目录,我们会看到下面的结构--src--client//这个里面主要是封装了fetch这个方法--core//这个是主要的方法,/api/auth/xxx的api及页面都是在这个里面......