c++全排列 next_permutation()函数

c++全排列

转载博客:https://www.cnblogs.com/cstdio1/p/11311500.html

对于next_permutation函数,其函数原型为:
#include < algorithm>
bool next_permutation(iterator start,iterator end)
当当前序列不存在下一个排列时,函数返回false,否则返回true

同时,相对应的,上一个排列即为prev_permutation(int *begin, int end)
看如下代码:

#include <iostream>  
#include <algorithm>  
using namespace std;  
int main()  
{  
    int num[3]={1,2,3};  
    do  
    {  
        cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;  
    }while(next_permutation(num,num+3));  
    return 0;  
}

在这里插入图片描述
注意:当我们把while(next_permutation(num,num+3))中的3改为2时,输出就变为了下图所示:
在这里插入图片描述
说明此时只针对1,2进行了全排列,有两个,后面的3没有变化,同时改变了数组前两个的值。

由此可以看出,next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。

另外,需要强调的是,next_permutation()在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。

比如,如果数组num初始化为3,1,2,那么输出就变为了:
在这里插入图片描述

维基百科上全排列的实现:

循环法:

​
#include <iostream>
using namespace std;
bool arrsame(int* arr, int len, int num) {
    int i;
    for (i = 0; i < len; i++)
        if (arr[i] == num)
            break;
    return i != len;
}
bool next_perm(int* perm, const int k, const int n) {
    int i = k - 1;
    do
        perm[i]++;
    while (arrsame(perm, i, perm[i]) || (perm[i] >= n && i--));
    if (perm[0] >= n)
        return 0;
    for (int num = 0, seat = i + 1; seat < k; num++)
        if (!arrsame(perm, i + 1, num))
            perm[seat++] = num;
    return 1;
}
int main() {
    int n, k;
    cout << "perm(n,k):" << endl;
    cin >> n >> k;
    if (n < k || k <= 0)
        return 0;
    int* perm = new int[k];
    for (int i = 0; i < k; i++)
        perm[i] = i;
    do
        for (int i = 0; i < k; cout << ((++i < k) ? ',' : '\n'))
            cout << perm[i] + 1;
    while (next_perm(perm, k, n));
    delete[] perm;
    return 0;
}

​

递归法:

#include <bits/stdc++.h>
using namespace std;

struct prem {
    int len;
    vector<int> used, position;
    function<void(vector<int>&)> action;
    prem(int l = 0, function<void(vector<int>&)> a = [](vector<int>& position) {}) : len(l), used(l, -1), position(l), action(a) {}
    void run(int now = -1) {
        if (now == len - 1) {
            action(position);
            return;
        }
        int next = now + 1;
        for (int i = 0; i < len; i++) {
            if (used[i] == -1) {
                used[i] = next;
                position[next] = i;
                run(next);
                used[i] = -1;
            }
        }
    }
};
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int len = 4;
    prem p(len, [&](vector<int>& p) {
        for (int i = 0; i < len; i++) {
            cout << p[i] << " ";
        }
        cout << endl;
    });
    p.run();
    return 0;
}

next_permutation 可以自定义比较函数 例如:POJ 1256
题目中要求的字典序是:A’<‘a’<‘B’<‘b’<…<‘Z’<‘z’,所以在用函数之前必须得按照题目要求的进行排序

#include<iostream> //poj 1256 Anagram
#include<string.h>
#include<algorithm>
using namespace std;
int cmp(char a,char b) {
	if(tolower(a)!=tolower(b))//tolower 是将大写字母转化为小写字母.
		return tolower(a)<tolower(b);
	else
		return a<b;
}
int main() {
	char ch[20];
	int n;
	cin>>n;
	while(n--) {
		scanf("%s",ch);
		sort(ch,ch+strlen(ch),cmp);
		do {
			printf("%s\n",ch);
		} while(next_permutation(ch,ch+strlen(ch),cmp));
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/6300.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字节测试总监,让我们用这份《测试用例规范》,再也没加班过

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…

【故障诊断】基于最小熵反卷积、最大相关峰度反卷积和最大二阶环平稳盲反卷积等盲反卷积方法在机械故障诊断中的应用研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

vue尚品汇商城项目-day03【20.获取Banner轮播图的数据+21.使用swiper轮播图插件】

文章目录20.获取Banner轮播图的数据21.使用swiper轮播图插件本人其他相关文章链接20.获取Banner轮播图的数据 修改代码&#xff1a; src/api目录下新建mockAjax.js文件 //对axios二次封装 import axios from "axios"; import nprogress from "nprogress";…

操作系统-AOSOA

一、个人感受 1.1 权衡 在我写这份报告的时候&#xff0c;已经是 6 月 30 号了&#xff0c;经历了一个学期的“折磨”&#xff0c;我面对终点&#xff0c;已经没啥感觉了&#xff0c;就想着赶快呼噜完了就完事了。其实做这个项目最大的体会就是“人力有穷&#xff0c;一切皆权…

AnaXNet: Anatomy Aware Multi-label Finding Classification in Chest X-ray

文章来源&#xff1a;[MICCAI 2021] 代码&#xff1a;https://github.com/Nkechinyere-Agu/AnaXNet Keywords&#xff1a;Graph Convolutional Networks Multi-Label Chest X-ray image classification Graph Representation 本文提出的问题以及解决方案&#xff1a; 与上…

word打latex公式显示不成功,出现【 打不出左大括号

我想敲这个公式 正常的latex代码应该是 f(x)\begin{cases}x, & \text{if }x\geq 0\\ax, & \text{if }x \leq 0\end{cases} 把latex代码复制到word后&#xff0c;发现公式不对 变成了这样 不识别\begin{cases}和左大括号 我这里用\matrix{}替换\begin{cases} \end{…

Springboot高级(一)缓存

一、缓存结构 二、注解 三、体验缓存 1、开启缓存 EnableCaching SpringBootApplication EnableCaching public class SpringbootCacheApplication {2、标志注解 &#xff08;1&#xff09;Cacheable Cacheable(value "emp", condition "#id2", unless…

(七)Tomcat源码阅读:Host组件分析

一、概述 Host类中比较重要的类就是HostConfig其它类实现的功能和之前的组件差不多&#xff0c;这里就不多介绍了。 二、阅读源码 1、HostConfig &#xff08;1&#xff09;重要方法 lifecycleEvent&#xff1a; 根据对应的方法设置对应的属性&#xff0c;并调用对应的方法…

熬夜肝完~ 阿里P8的Java进阶知识典藏版,我从18K飙到30K

最近有不少小伙伴给鄙人留言&#xff0c;春招不知道从何下手&#xff01;新的一年一定要抓住新的机会&#xff0c;不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 一般技术面试官都会通过自己…

React createContext 与 useContext 的基本使用

一、createContext 的使用 创建一个 Context 对象。当 React 渲染一个订阅了这个 Context 对象的组件&#xff0c;这个组件会从组件树中离自身最近的那个匹配的 Provider 中读取到当前的 context 值。 只有当组件所处的树中没有匹配到 Provider 时&#xff0c;其 defaultValue…

【Mysql】事务原理

【Mysql】事务原理 文章目录【Mysql】事务原理1. 事务2. 原理2.1 redo log2.1.1 分析问题2.2 undo log2.2.1 销毁和存储1. 事务 关于事务的基本概念可参见这篇文章&#xff1a;事务的四大特性(ACID) 2. 原理 研究mysql的事务原理就算研究mysql的InnoDB引擎是如何保证事务的四…

MySQL安装部署02-VirtualBox虚拟机上Centos6.8安装MySQL5.1.73

文章目录1、环境准备2、虚拟机内操作系统安装3、虚拟机网络配置&#xff0c;以便内外网均可访问4、安装前环境配置4.1、解决Centos6下yum无法使用的问题4.2、卸载系统自带MySQL4.3、系统配置&#xff1a;关闭selnux和防火墙5、安装6、总结1、环境准备 VirtualBox版本&#xff…

sql注入靶场练习

文章目录Less-1Less-2Less-3Less-4Less-5Less-6Less-7Less-8Less-9Less-10Less-11Less-12Less-13Less-14Less-15Less-16Less-17less-18Less-19Less-20Less-1 union没有被过滤&#xff0c;先试出来长度。 ?id1orderby3%23 ?id1orderby4%23到4时&#xff0c;发现 然后再试出来…

(五)MyBatis源码阅读: MyBatis基础模块-类型转换模块

一、概述 MyBatis是一个持久层框架ORM框架&#xff0c;实现数据库中数据和Java对象中的属性的双向映射&#xff0c;那么不可避免的就会碰到类型转换的问题&#xff0c;在PreparedStatement为SQL语句绑定参数时&#xff0c;需要从Java类型转换为JDBC类型&#xff0c;而从结果集…

Flink (六) --------- Flink 中的时间和窗口函数

目录一、时间语义1. Flink 中的时间语义2. 哪种时间语义更重要二、水位线&#xff08;Watermark&#xff09;1. 事件时间和窗口2. 什么是水位线3. 如何生成水位线4. 水位线的传递5. 水位线的总结三、窗口&#xff08;Window&#xff09;1. 窗口的概念2. 窗口的分类3. 窗口 API …

系统上线前,SQL脚本的9大坑

系统上线时&#xff0c;非常容易出问题。即使之前在测试环境&#xff0c;已经执行过SQL脚本了。但是有时候&#xff0c;在系统上线时&#xff0c;在生产环境执行相同的SQL脚本&#xff0c;还是有可能出现一些问题。有些小公司&#xff0c;SQL脚本是开发自己执行的&#xff0c;有…

【Java项目】SpringBoot实现一个请求同时上传多个文件和类并附上代码实例

文章目录前言文件多线程兼多文件上传RequestParam和RequestPart的区别前言 项目在做二手市场&#xff0c;然后商品的提交我们希望对商品的描述和商品的照片能一起传递到同一个接口来统一处理&#xff0c;而不是分发到两个接口中去处理&#xff0c;因为如果分到两个接口那么会特…

IDEA在console中编写sql语句报红

问题描述 IDEA 中在 console 里写 SQL 语句的时候爆红&#xff0c;表名、列名字段均为红色。 解决方案 以下四种方法亲测有效解决&#xff0c;不一定都需要用到&#xff0c;可以每次修改后重启IDEA工具查看效果&#xff01; 方法一&#xff1a; 首先检查是否匹配需要查询的表…

操作系统作业1

第四章 1. process-run.py -l 5:100,5:100 两进程都只使用CPU&#xff0c;不发起I/O请求 进程状态用下表表示&#xff1a; 每一时刻都有进程运行&#xff0c;因此CPU利用率为100%。 2. process-run.py -l 4:100,1:0 一个进程有4个需要CPU完成的指令&#xff0c;另一个进程只发…

MongoDB - 索引知识

索引简介 什么是索引 索引最常用的比喻就是书籍的目录&#xff0c;查询索引就像查询一本书的目录。 索引支持 MongoDB 查询的高效执行。如果没有索引&#xff0c;MongoDB 必须扫描集合中每一个文档&#xff0c;以选择与查询语句相匹配的文档。如果查询存在适当的索引&#x…
最新文章