每次找到未排序中最大值,想flip到顶部,然后flip到底部,注意特殊情况 如果已经在顶部或者底部,就不需要多余的flip操作了。
/*
* uva120.cpp
*
* Created on: 2013-4-12
* Author: kevinjiang
*/
#include<cstdio>
#include<cstring>
char line[200];
int pancakes[35];
int num;
void flip(int n) {
int tmp[35];
for (int i = 0; i <= num - n; i++)
tmp[i] = pancakes[i];
for (int i = 0; i <= num - n; i++)
pancakes[i] = tmp[num - n - i];
printf("%d ", n);
}
int findMax(int range) {
int max = -1;
int index = -1;
for (int i = 0; i < range; i++) {
if (pancakes[i] > max) {
max = pancakes[i];
index = i;
}
}
return index;
}
void sort() {
//i 代表每一趟
for (int i = 0; i < num; i++) {
//每一趟中先找到未排序中最大值位置,然后把这个元素flip到栈顶再flip到底下,注意如果最大值已经在顶上或者底下就不用多余的flip了
int maxIndex = -1;
maxIndex = findMax(num - i);
if (maxIndex == num - i - 1)
;
else if (maxIndex == 0) {
flip(i + 1);
} else {
flip(num - maxIndex);
flip(i + 1);
}
}
printf("0\n");
}
int main() {
setbuf(stdout,NULL);
int tmp;
char ch;
int i=0;
while(true)
{
scanf("%d",&tmp);
ch=getchar();
if(ch=='\n')
{
pancakes[i++]=tmp;
num=i;
i=0;
for(int i=0;i<num;i++)
printf("%d ",pancakes[i]);
printf("\n");
sort();
}
else if(ch==' ')
{
pancakes[i++]=tmp;
}
else if(ch==EOF) {
break;
}
else
;
}
return 0;
}
本文介绍了一种通过翻转操作来对一组煎饼进行排序的算法实现。该算法每次找到当前未排序部分的最大煎饼,并通过两次翻转操作将其移至正确的位置。文章详细解释了如何避免不必要的翻转,并提供了完整的 C++ 实现代码。
2432

被折叠的 条评论
为什么被折叠?



