问题
给定{1,2,…, n}的一个全排列,按照字典序列出从该排列开始的所有排列。
输入
- 第一行是一个正整数n(≤ 9),表示全排列是{1,2,…, n}的全排列
- 第二行是一个全排列
输出
按照格式要求输出该排列开始的所有排列
输入样例
3
231
输出样例
231
312
321
全排列方法一
#include <iostream>
using namespace std;
void swap(char &string1,char &string2)
{
char temp = string1;
string1 = string2;
string2 = temp;
}
int fun(char* string,int length)
{
bool flag = 0;
int part1,part2;
//从右开始,找出第一个比右边数字小的 x
for(int i=length-1;i>0;i--)
{
if(string[i-1] < string[i])
{
flag = 1;
part1 = i-1;
break;
}
}
if(flag == 0)
return 1;
//寻找右侧比x大的最小数字
int min = string[part1+1];
part2 = part1+1;
for(int i=length-1;i>part1;i--)
{
if(string[i] < min && string[i] > string[part1])
{
min = string[i];
part2 = i;
}
}
// 交换两数字
// cout<<part1<<" "<<part2<<endl;
swap(string[part1],string[part2]);
//倒转x右侧所有数字
for(int i=length -1,j= part1+1;i>j;)
{
swap(string[i],string[j]);
i--;
j++;
}
cout<<string<<endl;
return 0;
}
int main()
{
char str[9] = {0};
int length = 0;
scanf("%d",&length);
scanf("%s",str);
cout<<str<<endl;
while(!fun(str,length))
{
}
}