AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 1. Elementary Problem Solving ::Sorting/Searching
Description
对于一个栈, 有一种操作方法 Flip(x)。
该方法可以将栈顶的 x 个元素反转。
给出一个栈序列(从上到下), 要求通过操作使其越接近栈顶的元素越小。
输出按操作的先后顺序, 输出操作数 x 。
Type
Sorting/Searching
Analysis
直接以输入序列的方式来看这题。
则题目要求通过 Flip(x) 操作, 使得输入序列变为升序。
因为 Flip(x) 不会影响 x 位之后的元素,
所以从最后一位开始, 每次找到要调换到该位置的极大值,
利用 Flip(pos) (pos为该极大值所在的位置), 将其调到最前。
然后利用 Flip(x) 将其调到对应的位置。
之后再去操作前一位, 直到全部操作完为止即可。
Solution
// UVaOJ 120
// Stacks of Flapjacks
// by A Code Rabbit
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAXN = 32;
int stack[MAXN];
int top;
char ch;
void Tranform(int idx);
void Flip(int num);
int main() {
while (scanf("%d%c", &stack[0], &ch) != EOF) {
top = 1;
while (ch != '\n')
scanf("%d%c", &stack[top++], &ch);
for (int i = 0; i < top; i++)
printf("%d%c", stack[i], i < top - 1 ? ' ' : '\n');
Tranform(1);
puts("0");
}
return 0;
}
void Tranform(int x) {
if (x > top) return;
int idx = max_element(stack, stack + top - x + 1) - stack;
int pos = top - idx;
if (pos != x) {
if (pos != top) {
printf("%d ", pos);
Flip(pos);
} else {
printf("%d ", x);
Flip(x);
}
Tranform(x);
} else {
Tranform(x + 1);
}
}
void Flip(int x) {
int num = top - x;
for (int i = 0; i < (num + 1) / 2; i++)
swap(stack[i], stack[num - i]);
}