煎饼堆

前言

该题目确实算作一个很基础的题目,但真正去写时却很容易出错,主要在于两点

  1. 煎饼堆翻动时的细节处理
  2. 输入与输出处理

因此做一记录

题目

 Stacks of Flapjacks 

Background

Stacks and Queues are often considered the bread and butter of data structures and find use in architecture, parsing, operating systems, and discrete event simulation.  Stacks are also important in the theory of formal languages.

This problem involves both butter and sustenance in the form of pancakes rather than bread in addition to a finicky server who flips pancakes according to a unique, but complete set of rules.

The Problem

Given a stack of pancakes, you are to write a program that indicates how the stack can be sorted so that the largest pancake is on the bottom and the smallest pancake is on the top.  The size of a pancake is given by the pancake‘s diameter.  All pancakes in a stack have different diameters.

Sorting a stack is done by a sequence of pancake ``flips‘‘.  A flip consists of inserting a spatula between two pancakes in a stack and flipping (reversing)  the pancakes on the spatula (reversing the sub-stack).  A flip is specified by giving the position of the pancake on the bottom of the sub-stack to be flipped (relative to the whole stack).  The pancake on the bottom of the whole stack has position 1 and the pancake on the top of a stack of n pancakes has position n.

A stack is specified by giving the diameter of each pancake in the stack in the order in which the pancakes appear.

For example, consider the three stacks of pancakes below  (in which pancake 8 is the top-most pancake of the left stack):

         8           7           2
         4           6           5
         6           4           8
         7           8           4
         5           5           6
         2           2           7

The stack on the left can be transformed to the stack in the middle  via flip(3).  The middle stack can be transformed into the right stack via the command flip(1).

The Input

The input consists of a sequence of stacks of pancakes.  Each stack will consist of between 1 and 30 pancakes and each pancake will have an integer diameter between 1 and 100.  The input is terminated by end-of-file.  Each stack is given as a single line of input with the top pancake on a stack appearing first on a line, the bottom pancake appearing last, and all pancakes separated by a space.

The Output

For each stack of pancakes, the output should echo the original stack on one line, followed by some sequence of flips that results in the stack of pancakes being sorted so that the largest diameter pancake is on the bottom and the smallest on top.  For each stack the sequence of flips should be terminated by a 0 (indicating no more flips necessary).  Once a stack is sorted, no more flips should be made.

Sample Input

1 2 3 4 5
5 4 3 2 1
5 1 2 3 4

Sample Output

1 2 3 4 5
0
5 4 3 2 1
1 0
5 1 2 3 4
1 2 0

分析

可以按照下面的代码解,也可先对煎饼排序再对位置不符合的饼进行翻动。

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
FILE *in;
FILE *out;

#ifdef DEBUG
#define CIN     in
#define COUT    out
#else
#define CIN     stdin
#define COUT    stdout
#endif
#define CLR(vec) memset(vec, 0, sizeof(vec))
#define MAXN 35
int pancake[MAXN];
int pancakeCnt;
int start, end;
void reverse(int *vec, int start, int end){
 int tmp;
 while(start < end){
  tmp = vec[start];
  vec[start] = vec[end];
  vec[end]   = tmp;
  start++;
  end--;
 }
}
int searchMax(int *vec, int start, int end){
 int pos;
 int max_pos = start;
 for(pos = start; pos <= end; pos++){
  if(vec[pos] > vec[max_pos]){
   max_pos = pos;
  }
 }
 return max_pos;
}

void solve(int * vec, int start, int end)
{
 int max_pos;
 while(start != end){
  max_pos = searchMax(vec, start, end);
  
  if(vec[max_pos] == vec[start])
   max_pos = start;
  else if(vec[max_pos] == vec[end])
   max_pos = end;
  else
   ;
  if(max_pos == start){
  }else if(max_pos == end){
   printf("%d ", start);
   reverse(vec, start, end);
  }else{
   printf("%d ", max_pos);
   reverse(vec, max_pos, end);
   printf("%d ", start);
   reverse(vec, start, end);
  }
  start++;
 }
 printf("0\n");
}
int main(void){
 int num = 0;
 int val;
 int opt;
 int pos;
#ifdef DEBUG
 in =  freopen("./in",  "r", stdin);
 if(!in){
  fprintf(stderr, "open input file fail\n");
  return 0;
 }
 out =  freopen("./out", "w", stdout);
 if(!out){
  fprintf(stderr, "open input file fail\n");
  return 0;
 }
#endif
 CLR(pancake);
 pancakeCnt = 0;
 while( 2 == scanf("%d%c", &val, &opt)){
  pancake[++pancakeCnt] = val;
  if( ‘\n‘ == (char)opt){
   for(pos = 1; pos < pancakeCnt; pos++){
    printf("%d ", pancake[pos]);
   }
   printf("%d\n", pancake[pancakeCnt]);
   /*init flip*/
   start  = 1, end = pancakeCnt;
   reverse(pancake, start, end);
   solve(pancake, start, end);
   /*clean all*/
   CLR(pancake);
   pancakeCnt = 0;
  }
 }
return 0;
}

煎饼堆

时间: 2024-10-24 04:59:57

煎饼堆的相关文章

计划,,留

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 一.<算法竞赛入门经典> 刘汝佳 (UVaOJ 351道题) 以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html "AOAPC I"

UVa120 Stacks of Flapjacks (构造法)

链接:http://vjudge.net/problem/18284 分析:摊煎饼问题.以从大到小的顺序依次把每个数排到正确的位置,比如当处理第i大的煎饼时,是不会影响到第1,2,3,...,i-1大的煎饼的(它们已经正确的翻到了煎饼堆底部的i-1个位置上),翻煎饼的方法是先翻到最上面,然后翻到正确的位置,翻好了以后煎饼堆底部i个位置上的煎饼都已经正确放好就不用管了,接下来就是找第i+1大的煎饼放到下数上第i+1个位置上,不过对于当前最大煎饼的位置要分类讨论,如果已经在其正确位置上就什么也不用做

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大

HDU 1988 Flipping Burned Pancakes (同uva煎饼一样的题)

Problem Description The cook at the Frobbozz Magic Pancake House sometimes falls asleep on the job while cooking pancakes. As a result, one side of a stack of pancakes is often burned. Clearly, it is bad business to serve visibly burned pancakes to t

JavaScript栈和堆内存,作用域

1.栈 stack"和"堆 heap": 简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里.stack一般是静态分配内存,heap上一般是动态分配内存. 2.基本类型和引用类型: 基本类型:存放在栈内存中的简单数据段.数据大小确定,内存空间大小可以分配. 引用类型:存放在堆内存中的对象,变量中实际保存的是一个指针,这个指针指向另一个位置.每个空间大小不一样,要根据情况开进行特定的分配. 详见<Javas

堆内存、栈内存分析图

堆内存保存的是真正的数据,简单说是对象的属性信息 栈内存保存的是对内存的地址,简单理解对象名称

JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结--转载http://www.cnblogs.com/kubixuesheng/p/5202561.html

转载自---http://www.cnblogs.com/kubixuesheng/p/5202561.html 俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面的堆,栈 JVM的堆,栈和os如何对应 为啥方法的调用需要栈 属于月经问题了,正好碰上有人问我这类比较基础的知识,无奈我自觉回答不是有效果,现在深入浅出的总结下: 前一篇文章总结了:JV

数据结构中的堆

一:堆排序      堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆分为大根堆和小根堆,是完全二叉树.大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i].在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶.下面附上简单C#简单实现: using System; using System.Collections.Generi