最烂的算法,先按大小排序,从最大的开始,如果不在最底,则先换到最上再换到最下,依次进行。。

还要注意数组越界问题,比如记录次数的数组大小可能为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,它已经在该在的位置,结束