用STL的写全排列

<span style="font-family: sans-serif; ">next_permutation (BidirectionalIterator first, BidirectionalIterator last):n个元素有n!种排列。这些排列中,规定升序序列为最小排列,降序序列为最大的排列,任意两个排列按照字典序分出大小。该函数返回当前序列作为一个排列按字典序的下一个排列。</span>

prev_permutation(BidirectionalIterator first, BidirectionalIterator last): 返回当前序列作为一个排列按字典序的上一个排列。

所以 输入数据要先排序(排成升序或降序)在调用 permutation()函数;

下面是我写的一个代码:

#include<cstdio>
#include<algorithm>

using namespace std;

int main(){
       int a[10];
       int i;
       int n=4;
       for(i=0;i<n;i++){
              scanf("%d",&a[i]);
       }
      sort(a,a+n);
 //     for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n");
   /*    while(next_permutation(a,a+n)){        //调用STL中的全排列函数
              for(i=0;i<n;i++){
                     printf("%d ",a[i]);
              }
              printf("\n");
       }*/
       do{
              for(i=0;i<n;i++){
                     printf("%d ",a[i]);
              }
              printf("\n");
       }while(next_permutation(a,a+n));
       return 0;
}
如果不实现排序,只会输出一部分排列。
另附源码:
  template inline
   bool next_permutation(_BidIt _First, _BidIt _Last)
   { // permute and test for pure ascending, using operator<
   _BidIt _Next = _Last;
   if (_First == _Last || _First == --_Next)
   return (false);
  
   for (; ; )
   { // find rightmost element smaller than successor
   _BidIt _Next1 = _Next;
   if (*--_Next < *_Next1)
   { // swap with rightmost element that's smaller, flip suffix
   _BidIt _Mid = _Last;
   for (; !(*_Next < *--_Mid); )
   ;
   std::iter_swap(_Next, _Mid);
   std::reverse(_Next1, _Last);
   return (true);
   }
  
   if (_Next == _First)
   { // pure descending, flip all
   std::reverse(_First, _Last);
   return (false);
   }
   }
   }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值