您的位置:首页 > 其它

UVa Problem 120 Stacks of Flapjacks (煎饼堆)

2011-05-22 23:57 316 查看
// Stacks of Flapjacks (煎饼堆)
// PC/UVa IDs: 110402/120, Popularity: B, Success rate: high Level: 2
// Verdict: Accepted
// Submission Date: 2011-05-22
// UVa Run Time: 0.028s
//
// 版权所有(C)2011,邱秋。metaphysis # yeah dot net
//
// 先将数据排序,然后根据排序后的结果将原来的序列进行相应操作变成最终的序列。在排序时,由于可能有
// 两个饼具有相同的直径,故需要记录数据的序号,恢复的方法是找到当前尚未排序的X,先将其翻转到顶端,
// 然后再翻转到其在最终排序后的位置。

#include <iostream>
#include <sstream>
#include <algorithm>

using namespace std;

#define MAXSIZE 30

struct pancake
{
int diameter;
int index;
};

pancake pancakes[MAXSIZE];
pancake original[MAXSIZE];

bool cmp(pancake x, pancake y)
{
return x.diameter < y.diameter;
}

void flip(int pos, int size)
{
pancake tmp;
int i = 0, j = size - pos;
for (; i < j; i++, j--)
if (original[i].diameter != original[j].diameter)
{
tmp = original[i];
original[i] = original[j];
original[j] = tmp;
}
}

int main(int ac, char *av[])
{
string line;
while (getline(cin, line))
{
// 回显。
cout << line << endl;

// 读入数据。
int capacity = 0;
istringstream iss(line);
while (iss >> pancakes[capacity].diameter)
{
pancakes[capacity].index = capacity;
original[capacity] = pancakes[capacity];
capacity++;
}

// 排序。
sort(pancakes, pancakes + capacity, cmp);

// 执行翻转操作,若第 i 大元素未在第i位上,则先找到其序号,然后
// 先将其翻转到顶端,然后再翻转到位置i。
for (int i = capacity - 1; i >= 0; i--)
{
// 在当前序列中找到该元素。
// 假如数原来的序号与当前的序号不等,需要翻转操作。
int marker;
for (int j = 0; j < capacity; j++)
if (original[j].index == pancakes[i].index)
{
marker = j;
break;
}

if (marker != i)
{
if (marker != 0)
{
cout << (capacity - marker) << " ";
flip(capacity - marker, capacity);
}

cout << (capacity - i) << " ";
flip(capacity - i, capacity);
}
}

cout << "0" << endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: