蓝桥杯:C++排列与组合

news2024/11/28 20:33:26

排列是暴力枚举时的常见操作。有以下两种情况。

C++的 next_permutation()是全排列函数,只能输出序列中所有元素的全排列。

本节将给出手写排列和组合的代码。因为在很多场合中不能使用系统自带的排列函数,所以需要自己编写。

全排列函数:next_permutation()

STL提供了求下一个排列组合的函数next_permutation()。例如对于由3个字符{a,b, c}组成的序列,next_permutation()能按字典序返回6个组合:abc、acb、bac、bca、cab、cba。

函数next_permutation()的定义有以下两种形式:

bool next_permutation (BidirectionalIterator first, BidirectionalIterator last);
bool next_permutation (BidirectionalIterator first, BidirectionalIterator last, Compare comp);

返回值:如果没有下一个排列组合,则返回False,否则返回True。每执行一次next_ permutation(),新的排列就会被放到原来的空间里。

简称:前闭后开。

next_permutation()从当前的全排列开始,逐个输出更大的全排列,而不是输出所有的全排列,例如下面的代码。

#include <bits/stdc++.h>
using namespace std;
int main() {
	string s=”bca”;
	do {
		cout<<s<< " ";
	} while(next_permutation(s.begin(),s.end()));
	return 0;
}   //输出:bca cab cba

如果要得到所有的全排列,就需要从最小的全排列开始。如果初始的全排列不是最小的,则需要先用sort()对全排列排序,得到最小的全排列后,再使用next_permutation(),例如下面的代码。

#include <bits/stdc++.h>
using namespace std;
int main() {
	string s=”bca”;
	sort(s.begin(),s.end());  //字符串内部排序,得到最小的排列“abc”
	do {
		cout<<s<< " ";
	} while(next_permutation(s.begin(),s.end()));
	return 0;
}   //输出:abc acb bac bca cab cba

C++中还有一个全排列函数prev_permutation(),用于求前一个排列组合,与next_permutation()相反,即从大到小输出排列。

手写排列代码(暴力法):

#include <iostream>
#include <vector>

//排列 
int main() {
    std::vector<int> s = {1, 2, 3, 4};
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            if (j != i) {
                for (int k = 0; k < 4; ++k) {
                    if (k != j && k != i) {
                        std::cout << s[i] << s[j] << s[k] << ", ";
                    }
                }
            }
        }
    }
    return 0;
}

手写组合代码(暴力法):

#include <iostream>
#include <vector>

int main() {
    std::vector<int> s = {1, 2, 3, 4};
    for (int i = 0; i < 4; ++i) {
        for (int j = i + 1; j < 4; ++j) {
            for (int k = j + 1; k < 4; ++k) {
                std::cout << s[i] << s[j] << s[k] << ", ";
            }
        }
    }
    return 0;
}

例题1.排列序数

思路:先对输入的字符串s排序,然后用next_permutation()输出全排列,当全排列与初始的字符串相等时结束。

代码:

#include <bits/stdc++.h>
using namespace std;
int main() {
	string s,olds;
	cin>>s;
	olds=s;   //用olds记录最初的字符串
	int cnt = 0;
	sort(s.begin(),s.end());          //字符串内部排序,得到最小的排列
	do {
		if(s == olds) {
			cout<<cnt<<endl;
			break;
		}
		cnt++;
	} while(next_permutation(s.begin(),s.end()));
	return 0;
}

例题2.拼数

代码: 

#include<bits/stdc++.h>
using namespace std;
string a[21];  //记录20个数,用字符形式
bool cmp (string a, string b) {              //从大到小,按字典序的反序排列
	return a + b > b + a;                    //组合字符串,注意这个技巧,后面会详细讲解
}
int main( ) {
	int n;
	cin >> n;
	for(int i=0; i<n; i++)   cin >> a[i];
	sort(a, a+n, cmp);                       //从大到小,按字典序的反序排列
	for(int i=0; i<n; i++)     cout << a[i];
	return 0;
}

函数体中的这行代码:

return a + b > b + a;

是一个巧妙的比较方式,用于实现按字典序的反序(即从大到小)排列字符串。

如果 a + b 大于 b + a,说明 a 在字典序上大于 b,因此返回 true。

如果 a + b 小于 b + a,说明 a 在字典序上小于 b,因此返回 false。

如果它们相等,说明 a 和 b 相等,但由于我们在排序时通常不需要处理相等的情况,所以这个比较方式在这种情况下也能正常工作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lag-Llama:第一个时间序列预测的开源基础模型介绍和性能测试

2023年10月&#xff0c;我们发表了一篇关于TimeGPT的文章&#xff0c;TimeGPT是时间序列预测的第一个基础模型之一&#xff0c;具有零样本推理、异常检测和共形预测能力。 虽然TimeGPT是一个专有模型&#xff0c;只能通过API访问。但是它还是引发了对时间序列基础模型的更多研…

读十堂极简人工智能课笔记03_遗传算法与进化

1. 寻找正确答案 1.1. 卡尔西姆斯 1.1.1. 计算机图形艺术家和研究者 1.1.2. 演示过数字进化之创造性和新颖性的先驱 1.1.3. 1994年 1.1.3.1. 创造一批能游泳、走路、跳跃&#xff0c;甚至互相竞争的虚拟动物震惊了整个科学界 1.1.3.2. 它们的人工大脑却是个极其复杂的网络…

公需课考试怎么搜题找答案?推荐你使用这5个公众号和工具 #知识分享#其他#知识分享

大学生必备&#xff0c;这条笔记大数据一定定要推给刚上大学的学弟学妹&#xff01;&#xff01; 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试…

Leetcode-1572. 矩阵对角线元素的和

题目&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线…

解决ucore实验qemu不断重启问题

解决 ucore 实验 qemu 不断重启问题 做清华大学操作系统 ucore 实验 (x86版本)&#xff0c;实验一编译后运行 qemu 发现系统不断重启&#xff0c;无法正常运行 kernel。实验环境是 ubuntu 22.04&#xff0c;gcc 11.4.0&#xff0c;ld 2.38。最终查证是链接脚本 kernel.ld 导致…

Docker 在window 2024版笔记 下载 安装 操作 配置

---Docker 前言--- Docker windows版官方版是一款专业开源的应用容器引擎&#xff0c;可以加快用户构建、共享和运行现代应用程序的速度&#xff0c;支持运行Linux和Windows Docker容器。 Docker 在容器的基础上&#xff0c;进行了进一步的封装&#xff0c;从文件系统、网络互…

[office] excel2016怎么求最大值和最小值 #职场发展#知识分享

excel2016怎么求最大值和最小值 excel求最大值最小值步骤&#xff1a; 1、鼠标左键双击计算机桌面Excel2016程序图标&#xff0c;将其打开运行。在打开的Excel2016程序窗口&#xff0c;点击“打开其他工作簿”选项&#xff0c;打开需要进行编辑的Excel工作表。如图所示; 2、在打…

SpringCloud-搭建Nacos配置中心

一、Nacos 功能介绍 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一个分布式服务注册、配置管理&#xff0c;以及服务健康管理平台。在微服务架构中&#xff0c;配置管理是至关重要的一环&#xff0c;Nacos 提供了可靠、动态的配置…

python-分享篇-GUI界面开发-PyQt5-禁止窗体显示最大化按钮及调整窗体大小

代码 # -*- coding: utf-8 -*-# Form implementation generated from reading ui file nochange.ui # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! 禁止窗体显示最大化按钮及调整窗体大小from PyQt5 import QtCo…

开局托儿所

一&#xff0c;游戏规则 示例&#xff1a; 9549366345591582732535371762455786747469134955224161766515693255444341522757146691483635716392362557418825198461525396798798225943422864547928724689891326449758 二&#xff0c;贪心算法 我们先用贪心算法试一下&#xf…

wordpress好的网站主题

有什么好的网站主题&#xff0c;都分享在这里了。 蓝色风格的wordpress模板&#xff0c;好的wordpress网站主题&#xff0c;需要既好看&#xff0c;又好用。 https://www.zhanyes.com/qiye/6305.html 血红色的好看的wordpress主题&#xff0c;布局经典&#xff0c;设计好的&am…

Vue2学习第二天

Vue2 学习第二天 1. 数据绑定 Vue 中有 2 种数据绑定的方式&#xff1a; 单向绑定(v-bind)&#xff1a;数据只能从 data 流向页面。双向绑定(v-model)&#xff1a;数据不仅能从 data 流向页面&#xff0c;还可以从页面流向 data。 备注&#xff1a; 双向绑定一般都应用在表单…

大学生画图搜题答案神器?一键查询完备大学题库 #知识分享#经验分享#学习方法

大学生必备的搜题工具&#xff0c;专业课本习题、电子版教材、考研资料、英语四六级等考试题目也能一并搜索&#xff0c;每道题目都有详细的讲解&#xff0c;每个都堪称大学神器。 1.试题易 这是一个网站 涵盖初高中&#xff0f;大学&#xff0f;专升本&#xff0f;考研&…

python视频播放列表信息库之m3u8使用详解

m3u8库是什么&#xff1f; m3u8是一个用于解析和操作M3U8文件的Python库。M3U8文件&#xff0c;是指使用UTF-8编码格式的M3U文件&#xff0c;它们通常用于播放列表文件&#xff0c;尤其是在HTTP Live Streaming&#xff08;HLS&#xff09;中。简单来说&#xff0c;m3u8库能帮…

嵌入式中I2C 相关的硬件问题汇总及死锁解决办法

本文主要介绍如何解决I2C设备硬件设计上的各种问题&#xff0c;希望对大家有所帮助&#xff01; 关于I2C协议详细的讲解&#xff0c;可以参考之前的推文&#xff1a;全面解析 I2C 通信协议 一般情况下&#xff0c; i2c 设备焊接没什么问题&#xff0c;按照设备手册一步步来&a…

<网络安全>《33 网络信息安全基础(4)网络安全工程师进阶体系(一)》

1 图谱 1 基础入门 1.1 网络安全导论 网络安全行业简介&#xff1a; 行业前景 历史 重要事件 网络安全意识与法律法规 安全意识 法律法规 案例 网络安全管理概述 安全运营、运维、模型 等保测评 等保简介、等保规定、流程和规范 1.2 渗透测试基础 渗透测试概述 - 流程、分…

Go语言每日一练——链表篇(九)

传送门 牛客面试笔试必刷101题 ----------------链表相加(二) 题目以及解析 题目 解题代码及解析 解析 这一道题主要是要对链表相加的过程进行模拟&#xff0c;虽然思路不难但是细节出比较多&#xff0c;这里博主的思路主要是先将两个链表反转过来然后以Head1为基础来模拟…

java 宠物在线商城系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 宠物在线商城系统是一套完善的java web信息管理系统 servletdaobean mvc模式&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

Windows11通过SMB映射NAS网络驱动磁盘

环境 NAS&#xff1a;威联通TS-416 操作系统&#xff1a;Windows11 第一步 连接NAS winr 打开运行&#xff0c;输入NAS局域网IP地址&#xff0c;按照如下的格式输入 然后输入NAS的账号和密码就可以通过SMB连接到NAS了 第二步 映射网络驱动器 举个栗子&#xff1a;右键Stora…

记录 | windows pyqt5 pycharm配置

一、下载安装 离线安装 通过PyPI下载 https://pypi.org/ 依此搜索 python_dotenv&#xff0c;PyQt5_sip&#xff0c;PyQt5&#xff0c;pyqt5_tools&#xff0c;注意PyQt5和pyqt5_tools版本对应。 下载之后放在\Anaconda3\Lib\site-packagescmd依次 pip install *.whl 二…