C++中实现全排列方法

embedded/2025/2/1 11:22:23/

在 C++ 中实现全排列(Permutations)有多种方法,这里我将介绍两种常用的方法:递归方法和使用 STL 的 next_permutation 方法。

方法 1:递归方法

递归方法通过固定一个元素的位置,然后对剩余的元素进行全排列来实现。

#include <iostream>
#include <vector>
 
using namespace std;
 
void permute(vector<int>& nums, int start, vector<vector<int>>& result) {
    if (start == nums.size()) {
        result.push_back(nums);
        return;
    }
    for (int i = start; i < nums.size(); ++i) {
        swap(nums[start], nums[i]); // 固定一个位置
        permute(nums, start + 1, result); // 递归调用
        swap(nums[start], nums[i]); // 回溯,恢复原数组
    }
}
 
vector<vector<int>> permute(vector<int>& nums) {
    vector<vector<int>> result;
    permute(nums, 0, result);
    return result;
}
 
int main() {
    vector<int> nums = {1, 2, 3};
    vector<vector<int>> result = permute(nums);
    for (const auto& perm : result) {
        for (int num : perm) {
            cout << num << " ";
        }
        cout << endl;
    }
    return 0;
}
方法 2:使用 STL 的 next_permutation 方法

这种方法利用 C++ STL 中的 next_permutation 函数,它可以生成下一个排列直到所有的排列都被生成。

#include <iostream>
#include <vector>
#include <algorithm> // for std::next_permutation
 
using namespace std;
 
vector<vector<int>> permute(vector<int>& nums) {
    vector<vector<int>> result;
    sort(nums.begin(), nums.end()); // 先排序,确保从最小的排列开始
    do {
        result.push_back(nums); // 将当前的排列加入结果集
    } while (next_permutation(nums.begin(), nums.end())); // 生成下一个排列,直到所有排列都被生成
    return result;
}
 
int main() {
    vector<int> nums = {1, 2, 3};
    vector<vector<int>> result = permute(nums);
    for (const auto& perm : result) {
        for (int num : perm) {
            cout << num << " ";
        }
        cout << endl;
    }
    return 0;
}
说明:

递归方法 更直观地展示了全排列的生成过程,通过固定一个元素的位置并递归处理剩余元素。这种方法易于理解和实现。

next_permutation 方法 利用了 STL 的高效算法,代码更简洁,但需要先对数组进行排序。这种方法适合需要直接生成所有排列的场景。

你可以根据自己的需要选择合适的方法。


http://www.ppmy.cn/embedded/158611.html

相关文章

基于Docker搭建Sentinel Dashboard

从官网下载sentinel jar文件在与sentinel-dashboard-1.8.8.jar同一目录创建Dockerfile文件构建docker镜像文件创建镜像tag包提交镜像至镜像仓库下面就可以部署sentinel-dashboard容器了验证sentinel-dashboard控制台是否可用Sentinel 是一个开源的分布式流量控制与熔断框架,由…

DeepSeek r1本地安装全指南

环境基本要求 硬件配置 需要本地跑模型&#xff0c;兼顾质量、性能、速度以及满足日常开发需要&#xff0c;我们需要准备以下硬件&#xff1a; CPU&#xff1a;I9内存&#xff1a;128GB硬盘&#xff1a;3-4TB 最新SSD&#xff0c;C盘确保有400GB&#xff0c;其它都可划成D盘…

大数据学习之SCALA分布式语言三

7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…

Safe 推出 Agentathon 活动:推动 AI 原生智能账户采用

“Safe Ecosystem Foundation 将于 2025 年 2 月 3 日至 17 日举行首届 Safe Agentathon 活动——一个专注于 DeFAI 的黑客马拉松&#xff0c;全球开发者将有机会争夺超过 20 万美元的赏金&#xff0c;并与 Ai16z、Consensys、Kraken 等顶尖专家共同合作。为期两周的赛事将展示…

【机器学习】自定义数据集 ,使用朴素贝叶斯对其进行分类

一、贝叶斯原理 贝叶斯算法是基于贝叶斯公式的&#xff0c;其公式为&#xff1a; 其中叫做先验概率&#xff0c;叫做条件概率&#xff0c;叫做观察概率&#xff0c;叫做后验概率&#xff0c;也是我们求解的结果&#xff0c;通过比较后验概率的大小&#xff0c;将后验概率最大的…

tcp/ip协议和ip协议,tcp/ip协议 ip协议

TCP/IP协议和IP协议在网络通信中扮演着重要的角色&#xff0c;它们之间既有联系又有区别。以下是对两者的详细解释&#xff1a; TCP/IP协议 定义&#xff1a; TCP/IP协议&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;是网络通信协议的一种&…

QT中给界面设置qss样式

1.在main函数中添加qss样式表 //1.读取qss文件QFile qss(QString("H:/code/QT_study/qss/page.qss"));if (qss.open(QFile::ReadOnly)){a.setStyleSheet(qss.readAll());}2.在使用的地方设置 if (parent->objectName().isEmpty()) {parent->setObjectName(QS…

Haskell语言的安全开发

Haskell语言的安全开发 引言 随着软件工程的不断发展&#xff0c;安全性问题日益成为软件开发中的关键挑战之一。面对日益复杂的系统和不断更新的攻击手段&#xff0c;开发者需要采用更加严格和有效的手段来保证软件的安全性。Haskell作为一种纯函数式编程语言&#xff0c;以…