全排列

本文详细介绍如何使用next_permutation()和prev_permutation()函数生成数组的所有可能排列,包括函数的工作原理、使用方法及示例代码。此外,还提供了一种基于回溯算法的全排列生成方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


全排列

函数排序 next_permutation() prev_permutation()

注意事项

函数next_permutation()是按照字典序产生排列的,并且是从数组中当前的字典序开始依次增大直至到最大字典序
函数prev_permutation()是按照字典序产生排列的,并且是从数组中当前的字典序开始依次减小直至到最小字典序
即二者排序方式是完全相反的,前者按照升序进行排列,后者按照降序进行排列
(此方法不光可应用于整型,字符型可是可以的)

介绍

存在于头文件中,有如下代码

int a[];
do
{

}
while(next_permutation(a,a+n));

具体使用

输入n,产生1~n的全排列

#include <iostream>
#include <algorithm>
  using namespace std;
  int main(){
      int n;
      cin>>n;
          int a[1000];
        //这里输入的是需要进行排列的元素,若需要排列1~n,只需依次给a[i]赋值即可 
          for(int i=0;i<n;i++)  
              cin>>a[i];
         
         //sort(a,a+n);  如果是a[i]已经按照从小到大的顺序赋值的话,则可以不用sort
         do{
             for(int i=0;i<n;i++)
                 cout<<a[i];
             cout<<endl;
         }while(next_permutation(a,a+n));  
         //next_permutation(a,a+n),有下一个排序就返回true,否走返回false 
     
     return 0;
}

例如输入
3
1 0 2

如果有sort() //即是按照从从小到大的顺序
输出为

0 1 2
0 2 1
1 0 2
1 2 0
2 0 1
2 1 0

若无
则输出为

1 0 2
1 2 0
2 0 1
2 1 0

补充

若a[3]={1,2,3}
如果改成 while(next_permutation(a,a+2));(只对前两个元素进行字典排序)
则输出:
1 2 3
2 1 3

显然,如果改成 while(next_permutation(a,a+1));
则只输出:1 2 3

若int a[3]={3,2,1};
next_permutation(a,a+3);
则只输出:3 2 1

常规回溯做法

Code

#include<iostream>
using namespace std;

int p[10]={0};
bool vis[10]={0};
int n;

void dfs(int x)
{	
    if (x==n+1){
		for(int i=1;i<=n;i++)
		cout<<p[i]<<" ";
		cout<<endl;
		return;
	}
	for (int i=1;i<=n;i++){
		if (vis[i]==false){
			p[x] = i;
			vis[i] = true;
			dfs(x+1);   //没达到n,继续加1 
			vis[i] = false; //回溯清空当前状态,将vis[i]设为没访问过 
		}
	}
}

int main()
{
	while (cin>>n){
		dfs(1);
	}
	return 0;
}

又是累成狗的一天…

详细内容可以去我的个人博客观看,请戳这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值