最爛的算法,先按大小排序,從最大的開始,如果不在最底,則先換到最上再換到最下,依次進行。。

還要注意數組越界問題,比如記錄次數的數組大小可能為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,它已經在該在的位置,結束