C++ 全排列函数 nyoj 366

C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序、std::prev_permutation提供降序。

1.std::next_permutation函数原型

  template <class BidirectionalIterator>

  bool next_permutation (BidirectionalIterator first, BidirectionalIterator last );

  template <class BidirectionalIterator, class Compare>

  bool next_permutation (BidirectionalIterator first,BidirectionalIterator last, Compare comp);

说明:next_permutation,重新排列范围内的元素[第一,最后一个)返回按照字典序排列的下一个值较大的组合。

返回值:如果有一个更高的排列,它重新排列元素,并返回true;如果这是不可能的(因为它已经在最大可能的排列),它按升序排列重新元素,并返回false。

2.算法实现原理

见:http://hi.baidu.com/bellgrade/item/70b65b8a7ea3c9c398255fd4

算法描述:

1、从尾部开始往前寻找两个相邻的元素

第1个元素i,第2个元素j(从前往后数的),且i<j

2、再从尾往前找第一个大于i的元素k。将i、k对调

3、[j,last)范围的元素置逆(颠倒排列

例:

D的小L

时间限制:4000 ms  |            内存限制:65535 KB

难度:2

描述
      一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡出了个题目想难倒匡匡(小L很D吧),有一个数n(0<n<10),写出1到n的全排列,这时匡匡有点囧了,,,聪明的你能帮匡匡解围吗?
输入
第一行输入一个数N(0<N<10),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10)
输出
按特定顺序输出所有组合。 特定顺序:每一个组合中的值从小到大排列,组合之间按字典序排列。
样例输入
2
2
3
样例输出
12
21
123
132
213
231
312
321
 1 #include <cstdio>
 2 #include <algorithm>
 3
 4 using namespace std;
 5 int a[]={1,2,3,4,5,6,7,8,9};
 6 int main()
 7 {
 8     int t;
 9     scanf("%d", &t);
10     while(t--){
11         int n;
12         scanf("%d", &n);
13         // for(int i = 0; i < n; i++){
14         //     a[i] = i + 1;
15         // }
16         do
17         {
18             for(int i = 0; i < n; i++){
19                 printf("%d", a[i]);
20             }
21             printf("\n");
22         }while (next_permutation(a, a + n));
23     }
24
25     return 0;
26 }

字符:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <string>
 4
 5 using namespace std;
 6
 7 int main()
 8 {
 9     string str;
10     cin >> str;
11     sort(str.begin(), str.end());
12     cout << str << endl;
13     while (next_permutation(str.begin(), str.end()))
14     {
15         cout << str << endl;
16     }
17     return 0;
18 }
时间: 2024-12-27 20:27:48

C++ 全排列函数 nyoj 366的相关文章

NYOJ 366 STL 全排列

D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2 描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡出了个题目想难倒匡匡(小L很D吧),有一个数n(0<n<10),写出1到n的全排列,这时匡匡有点囧了,,,聪明的你能帮匡匡解围吗? 输入 第一行输入一个数N(0<N<10),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10) 输出 按

C++ STL 全排列函数详解

一.概念 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n!个. 比如a,b,c的全排列一共有3!= 6 种 分别是{a, b, c}.{a, c, b}.{b, a, c}.{b, c, a}.{c, a, b}.{c, b, a}. 二.常用操作 1.头文件 #include <algorithm> 2.使用方法 这里先说两个概念:"下一个排列组合&qu

【转】next_permutation和prev_permutation(STL库中的全排列函数)用法

这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm> 下面是以前的笔记    与之完全相反的函数还有prev_permutation,查询当前排序上一个字典序.   返回为bool型,若返回true则成功生成,返回false则失败,还原到升序或降序的排列,与sort连用风味更佳   (1) int 类型的next_permutation   int main() {  int a[3]; a[0]=1;a[1]=2;a[2]=3;  do { cout<

NYoj 366 D的小L 【DFS】

D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2 描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡出了个题目想难倒匡匡(小L很D吧),有一个数n(0<n<10),写出1到n的全排列,这时匡匡有点囧了,,,聪明的你能帮匡匡解围吗? 输入 第一行输入一个数N(0<N<10),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10) 输出 按

next_permutation( ) 和prev_permutation( ) 全排列函数

头文件#include <algorithm> 两者都是用来计算排列组合的函数.前者是求出下一个排列组合,而后者是求出上一个排列组合. 所谓"下一个"和"上一个",有一个例子; 对序列 {a, b, c}, a > b >c,它的下一个序列即为{a, c, b},而{a, c, b}的上一个序列即为{a, b, c},同理可以推出所有的六个序列为:{a, b, c}.{a, c, b}.{b, a, c}.{b, c, a}.{c, a, b

HDU 1027 Ignatius and the Princess II[DFS/全排列函数next_permutation]

Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9458    Accepted Submission(s): 5532 Problem Description Now our hero finds the door to the BEelzebub feng5166. He op

全排列函数C++实现

例题:求由123456789构成的所有九位数字 1 用C++的next_permutation函数 #include <iostream> #include <stdio.h> #include <algorithm> int main(){ int a[9] = {1,2,3,4,5,6,7,8,9}; while(next_permutation(a, a+9)){ for(int i =0;i<9;i++) cout<<a[i]; cout<

STL之全排列函数poj1716

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main(){ //freopen("input.txt","r",stdin); int a[5],tag=0; while(scanf("%d%d%d%d",&a[0],&a[1],&

C++全排列函数

#include<algorithm> #include<iostream> using namespace std; #include<algorithm> int main() { int a[3]={1,2,3}; do { int i; for(i=0;i<3;i++) { cout<<a[i]; } cout<<endl; }while(next_permutation(a,a+3)); return 0; } 原文地址:http