#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int n=0;
string s;
ifstream finput;
finput.open("input.txt");
finput>>n;
finput>>s;
finput.close();
int *v=new int[n+1];
int i=0;
for(i=1;i<=n;++i)
{
v[i]=s[i-1]-48;
}
int calculat_num(int*,int);
int (*p_calculat_num)(int*,int);
p_calculat_num=calculat_num;
int num=(*p_calculat_num)(v,n);
void next_num(int*,int);
void (*p_next_num)(int*,int);
p_next_num=next_num;
(*p_next_num)(v,n);
ofstream foutput;
foutput.open("output.txt");
foutput<<num<<endl;
for(i=1;i<=n;++i)
{
foutput<<v[i];
}
foutput.close();
delete [] v;
return 0;
}
void next_num(int* v,int n)
{
int max=n;
while(v[max]<v[max-1])
{
--max;
}
int i=max;
while(v[max-1]<v[i])
{
++i;
if(i==(n+1)) break;
}
int temp=v[max-1];
v[max-1]=v[i-1];
v[i-1]=temp;
int j=max;
while(j<n)
{
temp=v[n];
v[n]=v[j];
v[j]=temp;
++j;
--n;
}
}
int calculat_num(int* v,int n)
{
int *num=new int[n+1];
int result=0;
int factorial(int);
int (*p_factorial)(int);
p_factorial=factorial;
for(int i=1;i<=n;++i)
{
num[i]=0;
for(int j=i;j<=n;++j)
{
if(v[j]<v[i]) num[i]+=1;
}
}
for(int i=1;i<=n;++i)
{
result+=num[i]*(*p_factorial)(n-i);
}
delete [] num;
return result;
}
int factorial(int n)
{
if(n==0)return 0;
int result=1;
for(int i=1;i<=n;++i)
{
result*=i;
}
return result;
int main(){
int n;
scanf("%d",&n);
int a[NUM];
memset(a,0,sizeof(a));
int i=0;
for (i=0;i<n;i++) {
scanf("%d",&a[i]);
}
int flag[NUM];
memset(flag,0,sizeof(flag));
printf("%d\n",index(a,n,flag)-1);
int b[NUM];
memset(b,0,sizeof(b));
if(next(a,b,n)==-1) printf("它是最后一个排列,下一个排列不存在\n");
else{
for (i=0;i<n;i++) printf("%d ",b[i]);
printf("\n");
}
return 0;
}
总觉得这道题应该有更好的巧妙的方法......
看能不能通过某些边界条件。