最爛的算法,先按大小排序,從最大的開始,如果不在最底,則先換到最上再換到最下,依次進行。。
還要注意數組越界問題,比如記錄次數的數組大小可能為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,它已經在該在的位置,結束