题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=37
题目类型: 数据结构, 二叉树
题意:
有N个位置, 编号为 0~N-1, 初始下,各个位置上放置这和位置编号相同的砖块,即砖块1,砖块2……砖块N-1。 然后有四种命令操作方式:
1.moveaontob :把砖a移动到砖b上面,如果a和b上面都有砖块,要先把它们放回原来位置。
2.move a over b: 把a移动到有b的“砖堆”上面,移动前需要把a上面的砖块都恢复到原位置,b的堆保持不变。
3.pileaontob:把a之上的(包括a)搬到b之上,要先把b上面的砖放回到原来位置
4.pileaoverb:
直接把a之上的(包括a)搬到b所在的“砖堆”上。
5.quit: 结束命令。
解体思路: 初刚看到时,想用stack模拟,但是这样操作会比较多,可能会TLE。 于是自己模拟写了类似栈的类,但是可以随机存储。 STL确实用起来比较方便,但是很不灵活。
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int n, block_a, block_b, pos_a, pos_b;
string command1,command2;
class Pile{
public:
Pile(){ index = 0; }
void init_set(int a){
index=0;
arr[index++] = a;
}
int top(){
return arr[index-1];
}
void add(int a){
arr[index++] = a;
}
bool is_empty(){
if(index==0)
return true;
return false;
}
int find(int a){
for(int i=0; i<index; ++i){
if(arr[i]==a)
return i;
}
return -1;
}
void output(){
if(index!=0){
for(int i=0; i<index; ++i){
printf(" %d",arr[i]);
}
}
}
int arr[100];
int index;
};
Pile arr[100];
// 找到砖块a所在的堆。
int find_block(int a){
int result;
for(int i=0; i<n; ++i){
result=arr[i].find(a);
if(result!=-1) return i;
}
}
// 把砖块a之上的砖块全都返回初始位置。pos时砖堆位置
void return_block(int pos, int a){
if(arr[pos].top()==a) return;
int index=arr[pos].find(a);
for(int i=index+1; i<arr[pos].index; ++i){
int temp=arr[pos].arr[i];
arr[temp].init_set(temp);
}
arr[pos].index = index+1;
}
void move_a_onto_b(int a,int b){
if(a==b) return ;
pos_a = find_block(a);
pos_b = find_block(b);
if(pos_a==pos_b) return ;
return_block(pos_a, a);
return_block(pos_b, b);
arr[pos_b].add(a);
--arr[pos_a].index;
}
void move_a_over_b(int a,int b){
if(a==b) return ;
pos_a = find_block(a);
pos_b = find_block(b);
if(pos_a==pos_b) return ;
return_block(pos_a, a);
arr[pos_b].add(a);
--arr[pos_a].index;
}
void pile_a_onto_b(int a,int b){
if(a==b) return ;
pos_a = find_block(a);
pos_b = find_block(b);
if(pos_a==pos_b) return ;
return_block(pos_b,b);
int index=arr[pos_a].find(a);
for(int i=index; i<arr[pos_a].index; ++i){
arr[pos_b].add(arr[pos_a].arr[i]);
}
arr[pos_a].index = index;
}
void pile_a_over_b(int a,int b){
if(a==b) return ;
pos_a = find_block(a);
pos_b = find_block(b);
if(pos_a==pos_b) return ;
int index = arr[pos_a].find(a);
for(int i=index; i<arr[pos_a].index; ++i){
arr[pos_b].add(arr[pos_a].arr[i]);
}
arr[pos_a].index = index;
}
void solve(){
if(command1=="move" && command2=="onto"){
move_a_onto_b(block_a,block_b);
}
else if(command1=="move" && command2=="over"){
move_a_over_b(block_a,block_b);
}
else if(command1=="pile" && command2=="onto"){
pile_a_onto_b(block_a,block_b);
}
else if(command1=="pile" && command2=="over"){
pile_a_over_b(block_a,block_b);
}
}
void init(int n){
for(int i=0; i<n; ++i){
arr[i].init_set(i);
}
}
void output(){
for(int i=0; i<n; ++i){
printf("%d:",i);
arr[i].output();
printf("\n");
}
}
int main()
{
freopen("input.txt","r",stdin);
scanf("%d",&n);
init(n);
while( cin >> command1 >> block_a >> command2 >> block_b){
if(command1=="quit") break;
solve();
}
output();
return 0;
}
—— 生命的意义,在于赋予它意义。
分享到:
相关推荐
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。在这个关于各种数据结构的代码程序中,我们涵盖了多个重要的数据结构及其相关的算法,包括单链表、树、森林、图、排序和查找。以下是这些主题...
题面
the_building_blocks
Code::Blocks是一款强大的开源集成开发环境(IDE),它支持多种编程语言,包括Frotran、C++和Python等。在本文中,我们将深入探讨Code::Blocks的特性、用途以及如何利用它来编辑、修改和应用Frotran语言。 首先,让...
数据结构是计算机科学中的核心课程,它探讨了如何有效地存储和组织数据,以便于高效地进行各种操作。在这个“数据结构作业——银行排队系统”中,我们主要关注的是队列这一基本数据结构,并且考虑了VIP与普通用户的...
new_blocks_for_the_kids
这些块对应于各种编程语句,如控制流(如循环、条件判断)、数据处理(变量、列表)、运动、外观、事件等。通过将这些块组合,用户可以编写出实现特定功能的程序。 对于那些想要进行Scratch 3的二次开发的用户,`...
Templates for the Solution of Linear Systems - Building Blocks for Iterative Methods.ps
以上知识点提供了对标题《A Fast Taboo Search Algorithm for the Job Shop Problem》和描述中提到的各个方面深入的理解。涉及的标签“Taboo Search”和“Nowicki”指明了算法的关键技术和主要研究者。此外,从部分...
3. "locale"文件夹内包含汉化资源,这些资源是按照Code::Blocks的文件结构组织的,用于替换原英文界面中的字符串。 4. 打开Code::Blocks,选择"Settings" -> "Preferences",然后在弹出的设置窗口中找到"Appearance...
### 数据结构实验指导书知识点详解 #### 实验指导书概览 《数据结构与算法》实验指导书(第三版)是一本旨在帮助学生深入理解数据结构理论并掌握其实现技能的专业教材。本书由姚璐、徐红梅编著,出版于2010年9月。...
### 数据结构课设知识点:职工工资管理系统 #### 一、项目背景与目标 - **项目名称**:职工工资管理系统 - **目标概述**:开发一个能够有效管理职工工资的系统,实现工资信息的录入、查询、修改等功能。 #### 二...
Building Blocks.dotx为word2007的页码模板,亲测有效,安装方法百度下即可
在“C语言+数据结构课程设计”这个主题中,我们可以深入探讨两个核心的计算机科学概念:C语言编程和数据结构。C语言是一种强大的、低级的编程语言,它被广泛用于系统开发、嵌入式系统、游戏开发以及各种其他领域。而...
TBB吸收了许多过去二十年来在面向对象并行计算领域积累的最佳思想,包括高效的数据结构和算法、动态负载均衡策略以及灵活的任务调度机制。这使得TBB不仅在学术界受到好评,在工业界也得到了广泛的应用,成为多线程...
本文主要对Linux 2.6内核下Ext3文件系统的数据结构进行深入研究,并通过基准测试分析了其性能。 一、Ext3文件系统概述 Ext3(Third extended filesystem)是Linux环境下一种非常流行的日志文件系统。它在原有的Ext2...
算法与数据结构课程实验报告 一、实验目的 本次实验旨在通过实践操作,加深学生对算法与数据结构理论知识的理解和应用,掌握常见数据结构的实现及其操作方法,如顺序表、单链表、栈、队列等,同时锻炼编程能力和...