纯属模拟,但关键分为三种情况:最大的(没有排好的)元素在最底下、在最上面、在其他位置。
第一种情况:不需要排,因为已经在该在的位置。
第二种情况:需要一步,从它应该在的位置翻转一下。
第三种情况:需要两步,先把它翻转到最上面去,然后再从它应该在的位置翻转一次。
翻转操作我用栈和队列来回倒换。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
#define MAXINT 1234567890
int kk[35];
stack <int> S,K;
queue <int> Q;
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int i,n,k,j,count;
while(scanf("%d",&kk[1])!=EOF)
{
printf("%d",kk[1]);
n=1;
while(getchar()!='\n')
{
scanf("%d",&kk[++n]);
printf(" %d",kk[n]);
}
printf("\n");
for(i=n;i>=1;i--) S.push(kk[i]);
sort(kk+1,kk+1+n,cmp);
for(i=1;i<n;i++)
{
count=1;
while(!S.empty() && S.top()!=kk[i])
{
count++; Q.push(S.top()); S.pop();
}
if(count==1)
{
k=n+1-i;
for(j=0;j<k;j++)
{
Q.push(S.top()); S.pop();
}
while(!Q.empty())
{
S.push(Q.front()); Q.pop();
}
printf("%d ",i);
}
else if(n+1-count==i)
{
while(!Q.empty())
{
K.push(Q.front()); Q.pop();
}
while(!K.empty())
{
S.push(K.top()); K.pop();
}
}
else
{
printf("%d ",n+1-count);
Q.push(S.top()); S.pop();
while(!Q.empty())
{
S.push(Q.front()); Q.pop();
}
printf("%d ",i);
k=n+1-i;
for(j=0;j<k;j++)
{
Q.push(S.top()); S.pop();
}
while(!Q.empty())
{
S.push(Q.front()); Q.pop();
}
}
}
printf("0\n"); S.pop();
}
return 0;
}