英文题意翻译:
一个栈中保存煎饼的大小,每一个煎饼的大小不同。请通过翻转数组中元素的方法实现排序功能。
输入描述
每一组输入占一行,第一个数n表示栈中元素的个数
输出描述
每一组输出占一行,输出的第一个元素K为翻转的次数;接下来的K个元素分别表示进行对应翻转时,最后一个元素的位置。
例如栈中有2 5 6 1 3 4六个元素,第一次翻转时对2 5 6翻转,因此此次翻转对应的输出为3
算法描述
- 用数组num保存输入,temp=n,用来描述前temp个元素;ans向量报存输出结果
- 首先找到前temp个元素中的最大元素,假设他对应的下标为index
- 如果num[index]=index+1,表示前temp个元素中的最大值处于正确的位置,无需翻转;
- 如果index不为零,对0,index之间的元素进行翻转,将index+1放入ans向量;然后对0,temp之间的元素进行翻转,将temp+1放入ans 向量
C++代码
#include<iostream>
#include<vector>
using namespace std;
const int MAXN=1000;
vector<int> ans;
int num[MAXN];
void reverse(int l,int r)
{
int temp;
while(l<r)
{
temp=num[l];
num[l]=num[r];
num[r]=temp;
l++;
r--;
}
}
int max_element(int l,int r)
{
int max=num[l];
int index=l;
for(int i=l+1;i<=r;i++)
{
if(num[i]>max)
{
max=num[i];
index=i;
}
}
return index;
}
int main()
{
int n;
while(cin>>n)
{
if(n==0)
break;
for(int i=0;i<n;i++)
cin>>num[i];
int temp1=n-1;
while(temp1>=0)
{
int index=max_element(0,temp1);
if(num[index]==index+1)
{
temp1--;
continue;
}
if(index!=0)
{
reverse(0,index);
ans.push_back(index+1);
}
reverse(0, temp1);
ans.push_back(temp1+1);
temp1--;
}
int size=ans.size();
cout<<size;
for(int i=0;i<size;i++)
cout<<" "<<ans[i];
cout<<endl;
ans.clear();
}
return 0;
}