全排列问题

来源:互联网 发布:魔兽世界有趣的事 知乎 编辑:程序博客网 时间:2024/09/21 08:18

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1384

prev_permutation()求上一个排列 next_permutation()求下一个排列

给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = "1312",
输出为:

1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
Input
输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)
Output
输出S所包含的字符组成的所有排列
Input示例
1312
Output示例
112311321213123113121321211321312311311231213211
代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;


void quicksort(char a[],int left,int right)
{
    int i=left;
    int j=right;
    char temp=a[i];
    if(left>=right)
        return ;
    while(i!=j)
    {
        while(i<j&&a[j]>=temp)
            j--;
        if(i<j)
            a[i]=a[j];
        while(i<j&&a[i]<=temp)
            i++;
        if(i<j)
            a[j]=a[i];
    }
    a[i]=temp;
    quicksort(a,left,i-1);
    quicksort(a,i+1,right);
}
int main()
{
    int i,j,len;
    char ch[10];
    int a[10];
    while(scanf("%s",ch)!=EOF)
    {
        quicksort(ch,0,strlen(ch)-1);
        do
        {
           printf("%s\n",ch);
        }
        while(next_permutation(ch,ch+strlen(ch)));
    }
    return 0;
}