本蒟蒻的第一篇博客,大佬们轻点喷!!(这相当于本蒟蒻的学习记录
or笔记?,其中包涵实现全排列的两种方法)第一次写可能有些地方不全面or不尽人意,望大佬们指正!!并且很高兴佬们来评论交流!!最后也希望能帮助到大家!
1.next_permutation
next_permutaion(起始地址,末尾地址+1)
next_permutaion(起始地址,末尾地址+1,自定义排序)
next_permutation 是 C++ 标准库中的一个算法函数,用于生成给定序列的下一个排列。它可以帮助我们在一个序列的全排列中,按照字典序生成下一个排列。
这个函数是有返回值的,如果换得了(没到倒序排列),就返回true。换不了了(已经是倒序了),就返回false。
话不多说,看例子。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s="12345678";
do
{
for(int i=0;i<8;i++)
{
cout<<s[i];
if(i!=7)
cout<<" ";
}
cout<<endl;
}while(next_permutation(s.begin(),s.end()));
return 0;
}
这段代码是用于生成1~8的全排列。
do-while
循环中的 next_permutation
函数会在每次迭代中生成下一个排列,并输出当前的排列。当所有排列都生成完毕后,next_permutation
函数返回 false
,循环结束。
注意:
要使用next_permutation函数,需要确保序列中的元素是可以比较的,并且已经按照字典序排序。如果序列中有重复的元素,next_permutation 函数会生成所有不同的排列。如果序列中有多个相同的元素,它们的相对顺序在生成的排列中也会保持不变。
2.prev_permutation
prev_permutation与next_permutation相反。它用于生成给定序列的前一个排列。它可以帮助我们在一个序列的全排列中,按照字典序生成前一个排列。
int main() {
vector<int> nums = {3, 2, 1};
// 生成所有排列并输出
do {
for (auto i : nums) {
cout << i << " ";
}
cout <<endl;
} while (prev_permutation(nums.begin(), nums.end()));
return 0;
}
3 2 1
3 1 2
2 3 1
2 1 3
1 3 2
1 2 3
如果修改nums={1,2,3},则会仅仅输出
1 2 3
3.使用深度优先搜索 (DFS) 算法的全排列生成程序
#include<bits/stdc++.h>
using namespace std;
int a[10];
int st[10]={0};//st用来表示状态,一个数选or没选
void dfs(int step)//step代表当前位置
{
int i;
if(step==9)//
{
for(i=1;i<=8;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return;
}
for(i=1;i<=8;i++)//首先枚举第一个位置上的数1~8
{
if(!st[i])//数字i没有被选中
{
a[step]=i;//第step个位置填i;
st[i]=1;//i被选中
dfs(step+1);//前往下一个位置
st[i]=0;//回溯
}
}
}
int main()
{
dfs(1);//从第一个位置开始
return 0;
}