给定一个正整数n,1,2,...,n的全排列有n!种,按字典序从小到大,对于任意一个排列,给出它的下一个排列。如n=3,123的下一个排列为132。
代码:
#include<stdio.h>
#include<iostream>
using namespace std;
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
int a, b, i, j, k;
char num[12];
scanf("%s",num);
int tmp[12];
j=0;
for(i=n-1; i>0; --i)
{
a = num[i] - '0';
b = num[i-1] - '0';
if(a<b)
tmp[j++] = num[i]-'0';
else
break;
}
tmp[j]=num[i]-'0';
int max = tmp[j];
int id=j;
for(k=j-1; k>=0; --k)
{
if(tmp[k]>num[i-1]-'0')
{
if(tmp[k]<max)
max = tmp[k], id = k;
}
else
break;
}
tmp[id] = num[i-1]-'0';
num[i-1] = max+'0';
for( k=0; k<=j; ++k)
num[i++] = tmp[k]+'0';
for(i=0; i<n; i++)
printf("%c",num[i]);
printf("
");
}
return 0;
}