最烂的算法,先按大小排序,从最大的开始,如果不在最底,则先换到最上再换到最下,依次进行。。
还要注意数组越界问题,比如记录次数的数组大小可能为2*n-3.。。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100],b[100],n;
bool big(int x,int y)
{
return x>y;
}
int main()
{
int i,j;
while(scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
reverse(&a[1],&a[n+1]);
int tmp[100]={0},tp=1;
for(i=1;i<=n;i++)
b[i]=a[i];
sort(b+1,b+n+1,big);
for(i=1;i<=n;i++)
{
for(j=n;j>=i;j--)
{
if(b[i]==a[j])
{
if(i==j)
;
else
{
if(j!=n)
{
tmp[tp++]=n-j+1;
tmp[tp++]=n-i+1;
reverse(&a[j],&a[n+1]);
reverse(&a[i],&a[n+1]);
}
else
{
tmp[tp++]=n-i+1;
reverse(&a[i],&a[n+1]);
}
}
break;
}
}
}
printf("%d",tp-1);
for(i=1;i<tp;i++)
printf(" %d",tmp[i]);
printf("\n");
}
return 0;
}
PS:还有个算法
设flip(k)是将前k个数反转的操作
就以sample output第二个为例,43251
从最大数放起,先放5
在放5之前看4在不在5前面的数里,如果不在就不管他了,只处理5一个数,把它放到最后去
实际上是4在5前面,则先flip(3)让4紧挨5,变成23451
然后看3在不在4前面,在,并且正好紧邻
2同上
看1在不在2前面,不在,所以这次处理就处理到2,flip(4);flip(5)把2345放到最后去,变成12345
然后处理1,它已经在该在的位置,结束