题意:给你一串数字,按照一个规则从小到大排序,规则是:你只能选择一个位置,然后把这个位置以上的全部数字反过来。
先排序,然后从后往前扫,如果不是排序后的位置,则往前找,找到了,如果不是在0位置,那么,把它先翻到0位置,然后再翻回来。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int fun(char*,int*);
int main()
{
char str[200];
int num[50],aim[50],temp[50];
while(gets(str))
{
memset(num,0,sizeof(num));
memset(temp,0,sizeof(temp));
memset(aim,0,sizeof(aim));
int cnt=fun(str,num),i,j;
puts(str);
for(i=0;i<cnt;i++) aim[i]=num[i];
sort(aim,aim+cnt);
for(i=cnt-1;i>=0;i--)
{
if(num[i]==aim[i]) continue;
for(j=i-1;j>=0;j--)
{
if(num[j]==aim[i]) break;
}
if(j==0) printf("%d ",cnt-i);
else printf("%d %d ",cnt-j,cnt-i);
int d=0;
for(int k=i;k>j;k--) temp[d++]=num[k];
for(int k=0;k<=j;k++) temp[d++]=num[k];
for(int k=i+1;k<cnt;k++) temp[d++]=num[k];
for(int k=0;k<cnt;k++) num[k]=temp[k];
//for(int k=0;k<cnt;k++) printf("%d ",num[k]); puts("");
}
puts("0");
}
return 0;
}
int fun(char *a,int *b)
{
int len=strlen(a),temp=0,d=0;
for(int i=0;i<len;i++)
{
if(isdigit(a[i]))
{
temp=temp*10+a[i]-'0';
}
else
{
b[d++]=temp;
//cout<<temp<<endl;
temp=0;
}
}
if(temp!=0) b[d++]=temp;
return d;
}