题意:
给定一个数组,经过多次翻转后数组是递增的,输出原数组,翻转位置,最后输出一个0
如:
1 2 3 4 5
0
4 3 2 1 5
0
3 4 1 2 5
4 2 4 0
题解:
从数组的末位置开始循环,每次把对应位置最大的数翻转到对应位置,如1 2 3 4 5中5是最大的则应翻转到index=4这个位置,由于本来就在该位置,所以不用进行翻转。每次应考虑将最大数翻转到数组首地址之后,再进行最大数翻转到正确位置的操作。同时应考虑 1 1 1 1 1 输出 0 这种特殊情况
代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int stacks[35];
void flip(int i)
{
int times=(i+1)/2;
for(int j=0;j<times;j++)
{
swap(stacks[j],stacks[i-j]);
}
cout<<n-i<<" ";
}
int main()
{
string line;
while(getline(cin,line))
{
stringstream ss(line);
n=0;
while(ss>>stacks[n])
{
n++;
}
for(int j=0;j<n;j++)
cout<<stacks[j]<<" ";
cout<<endl;
for(int j=n-1;j>=0;j--)
{
int position = max_element(stacks,stacks+j+1)-stacks;
if(stacks[j]==stacks[position]) continue;
if(position>0) flip(position);
flip(j);
}
cout<<0<<endl;
}
return 0;
}