51Nod - 1384 全排列

给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = “1312”,
输出为:
1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
Input
输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)
Output
输出S所包含的字符组成的所有排列
Sample Input
1312
Sample Output
1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211

记录

STL 生成字典序全排列函数 next_permutation(a,a+len)

#include <algorithm>

bool next_permutation( iterator start, iterator end );    //输出所有比当前排列大的排列,顺序是从小到大
bool prev_permutation( iterator start, iterator end );    //输出所有比当前排列小的排列,顺序是从大到小

AC代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;
string s;
const int maxn = 20;
int a[maxn];

int main()
{
    while( cin >> s )
    {
        int len = s.length();
        for( int i = 0 ; i < len ; i++ )
            a[i] = s[i] - '0';
        sort(a,a+len);    //先排序为字典序最小的情况
        do
        {
            for( int i = 0; i < len; i++ )
                cout << a[i];
            puts("");
        }
        while( next_permutation(a,a+len) );
    }
    return 0;
}
posted @ 2017-12-21 14:44  JinxiSui  阅读(82)  评论(0编辑  收藏  举报