当前位置: 首页 > news >正文

c++ 全排列

在C++中,全排列(permutation)可以使用递归算法或标准库函数来实现。以下是使用递归和STL库std::next_permutation来生成一个集合的全排列的两种方法。

方法一:递归算法

递归方法通过交换元素来生成所有可能的排列组合。

#include <iostream>
#include <vector>
#include <algorithm>void permute(std::vector<int>& nums, int l, int r, std::vector<std::vector<int>>& result) {if (l == r) {result.push_back(nums);} else {for (int i = l; i <= r; ++i) {std::swap(nums[l], nums[i]);permute(nums, l + 1, r, result);std::swap(nums[l], nums[i]); // backtrack}}
}int main() {std::vector<int> nums = {1, 2, 3};std::vector<std::vector<int>> result;permute(nums, 0, nums.size() - 1, result);for (const auto& perm : result) {for (int num : perm) {std::cout << num << " ";}std::cout << std::endl;}return 0;
}

方法二:使用STL库std::next_permutation

std::next_permutation是C++标准库中提供的函数,用于生成字典序中的下一个排列。可以通过不断调用该函数来生成所有的排列组合。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {1, 2, 3};std::sort(nums.begin(), nums.end()); // 确保初始状态是最小排列do {for (int num : nums) {std::cout << num << " ";}std::cout << std::endl;} while (std::next_permutation(nums.begin(), nums.end()));return 0;
}

方法三:使用C++11或更高版本的std::vectorstd::algorithm

如果您使用的是C++11或更高版本,可以结合std::vectorstd::algorithm来简化代码。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {1, 2, 3};do {for (const int& num : nums) {std::cout << num << " ";}std::cout << std::endl;} while (std::next_permutation(nums.begin(), nums.end()));return 0;
}

这三种方法都能有效地生成并打印一个集合的所有排列。第一种方法通过递归和回溯的方式,适合理解递归思想和回溯算法的实现;第二种和第三种方法利用标准库函数std::next_permutation,简化了代码实现,适合实际项目中的快速应用。

http://www.lryc.cn/news/415701.html

相关文章:

  • 未授权访问漏洞系列详解⑤!
  • 【CONDA】库冲突解决办法
  • 【网络世界】数据链路层
  • AllReduce通信库;Reduce+LayerNorm+Broadcast 算子;LayerNorm(层归一化)和Broadcast(广播)操作;
  • 2024.8.5 作业
  • MySQL数据库——数据库的基本操作
  • SQL数据库语句练习
  • 【Python】常用的pdf提取库介绍对比
  • sbatch提交并行作业 运行python程序 指定输入参数从1到100
  • OD C卷 - 中庸行者
  • 最新CSS3横向菜单的实现
  • (2024,LlamaGen,Llama,自回归下一token预测,模型扩展)自回归模型优于扩散:Llama 用于可扩展图像生成
  • 重新安装操作系统的软件都有哪些?
  • 深圳水务展|2025深圳国际水务科技博览会
  • OpenAI not returning a result?
  • [Windows]_[初级]_[GetVersionEx获取系统版本错误的原因]
  • 2024,Java开发在中国市场还有发展前景吗?
  • gcc: string.c_str gcc-8.5的一个问题
  • 一道笔试题 - 无重复字符的最长子串
  • C#反射的NullReferenceException
  • 100道C/C++面试题
  • Python(模块)
  • 【八股文】Java基础篇
  • python rsa如何安装
  • P10289 [GESP样题 八级] 小杨的旅游
  • 网络编程 ----------- 4、组播与广播
  • 最短路径算法:Bellman-Ford算法
  • 爬虫:xpath模块及昵图网实例
  • 高级java每日一道面试题-2024年8月03日-web篇-forward和redirect有什么区别?
  • 如何让你的网站拥有更好的体验