The Blocks Problem
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 5004   Accepted: 2119

Description

Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AI study of planning and robotics (STRIPS) used a block world in which a robot arm performed tasks involving the manipulation of blocks.
In this problem you will model a simple block world under certain
rules and constraints. Rather than determine how to achieve a specified
state, you will "program" a robotic arm to respond to a limited set of
commands.

The problem is to parse a series of commands that instruct a robot
arm in how to manipulate blocks that lie on a flat table. Initially
there are n blocks on the table (numbered from 0 to n-1) with block bi
adjacent to block bi+1 for all 0 <= i < n-1 as shown in the
diagram below:



The valid commands for the robot arm that manipulates blocks are:

move a onto b

where a and b are block numbers, puts block a onto block b after
returning any blocks that are stacked on top of blocks a and b to their
initial positions.

move a over b

where a and b are block numbers, puts block a onto the top of the
stack containing block b, after returning any blocks that are stacked on
top of block a to their initial positions.

pile a onto b

where a and b are block numbers, moves the pile of blocks consisting
of block a, and any blocks that are stacked above block a, onto block
b. All blocks on top of block b are moved to their initial positions
prior to the pile taking place. The blocks stacked above block a retain
their order when moved.

pile a over b

where a and b are block numbers, puts the pile of blocks consisting
of block a, and any blocks that are stacked above block a, onto the top
of the stack containing block b. The blocks stacked above block a retain
their original order when moved.

quit

terminates manipulations in the block world.

Any command in which a = b or in which a and b are in the same stack
of blocks is an illegal command. All illegal commands should be ignored
and should have no affect on the configuration of blocks.

Input

The
input begins with an integer n on a line by itself representing the
number of blocks in the block world. You may assume that 0 < n <
25.

The number of blocks is followed by a sequence of block commands,
one command per line. Your program should process all commands until the
quit command is encountered.

You may assume that all commands will be of the form specified above. There will be no syntactically incorrect commands.

Output

The
output should consist of the final state of the blocks world. Each
original block position numbered i ( 0 <= i < n where n is the
number of blocks) should appear followed immediately by a colon. If
there is at least a block on it, the colon must be followed by one
space, followed by a list of blocks that appear stacked in that position
with each block number separated from other block numbers by a space.
Don't put any trailing spaces on a line.

There should be one line of output for each block position (i.e., n
lines of output where n is the integer on the first line of input).

Sample Input

10
move 9 onto 1
move 8 over 1
move 7 over 1
move 6 over 1
pile 8 over 6
pile 8 over 5
move 2 over 1
move 4 over 9
quit

Sample Output

0: 0
1: 1 9 2 4
2:
3: 3
4:
5: 5 8 7 6
6:
7:
8:
9: 题解:模拟题,有一个值得学习的小技巧,输入一共有4种指令,但是如果完全独立地处理各种指令,代码会变得冗长而且容易错,更好的方法是提取出指令之间的共同点,编写函数
减少重复代码
因为这个题木块的高度不确定,所以用vector很好 提示:vector之间可以之间赋值或者作为函数的返回值
代码:
 #include<cstdio>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
const int maxn = ;
int n;
vector<int> pile[maxn];
//找木块a所在的pile 和height, 以引用的形式返回调用者
void find_block(int a , int & p , int & h)
{
for(p = ; p < n ;p++)
for( h = ; h < pile[p].size() ; h++)
if(pile[p][h]==a) return;
}
//把第p堆高度为h的木块上方的所有木块移回原位
void clear_above(int p , int h )
{
for(int i = h+; i < pile[p].size(); i++)
{
int b = pile[p][i];
pile[b].push_back(b);//把木块b放回原位
}
pile[p].resize(h+);//pile只保留下标为0~h的元素
}
//把第p堆高度为h及其上方的木块整体移动到p2堆的顶部
void pile_onto(int p , int h , int p2)
{
for(int i = h ; i < pile[p].size() ; i++)
pile[p2].push_back(pile[p][i]);
pile[p].resize(h);
}
void print()
{
for(int i = ; i < n ;i++)
{
printf("%d:",i);
for(int j = ;j < pile[i].size();j++) printf(" %d",pile[i][j]);
printf("\n");
}
}
int main()
{
int a , b;
cin>>n;
string s1 , s2;
for(int i = ; i < n ;i++) pile[i].push_back(i);
while(cin>>s1>>a>>s2>>b)
{
int pa , pb , ha, hb ;
find_block(a,pa,ha);
find_block(b,pb,hb);
if(pa==pb) continue;//非法指令
if(s2=="onto") clear_above(pb,hb);
if(s1=="move") clear_above(pa,ha);
pile_onto(pa,ha,pb);
}
print();
return ;
}
												

The Blocks Problem(vector)的更多相关文章

  1. 【UVA - 101】The Blocks Problem(vector+模拟)

    The Blocks Problem Descriptions:(英语就不说了,直接上翻译吧) 初始时从左到右有n个木块,编号为0~n-1,要求实现下列四种操作: move a onto b: 把a和 ...

  2. Problem B The Blocks Problem(vector的使用)

    题目链接:Problem B 题意:有n块木块,编号为0~n-1,要求模拟以下4种操作(下面的a和b都是木块编号) 1. move a onto b: 把a和b上方的木块全部归位,然后把a摞在b上面. ...

  3. 【CF954I】Yet Another String Matching Problem(FFT)

    [CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...

  4. STL--向量(vector)

    STL的组成 标准模板库STL关注的重点是泛型数据结构和算法,其关键组成部分是容器(containers).算法(algorithms).迭代器(iterators).函数对象(Function Ob ...

  5. R语言编程艺术# 数据类型向量(vector)

    R语言最基本的数据类型-向量(vector) 1.插入向量元素,同一向量中的所有的元素必须是相同的模式(数据类型),如整型.数值型(浮点数).字符型(字符串).逻辑型.复数型等.查看变量的类型可以用t ...

  6. STL标准模板库 向量容器(vector)

    向量容器使用动态数组存储.管理对象.因为数组是一个随机访问数据结构,所以可以随机访问向量中的元素.在数组中间或是开始处插入一个元素是费时的,特别是在数组非常大的时候更是如此.然而在数组末端插入元素却很 ...

  7. List接口的实现类(Vector)(与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多。)

      LinkedList提供以下方法:(ArrayList无此类方法) addFirst();    removeFirst();   addLast();   removeLast(); 在堆栈中, ...

  8. R语言编程艺术#01#数据类型向量(vector)

    R语言最基本的数据类型-向量(vector) 1.插入向量元素,同一向量中的所有的元素必须是相同的模式(数据类型),如整型.数值型(浮点数).字符型(字符串).逻辑型.复数型等.查看变量的类型可以用t ...

  9. 【BZOJ3489】A simple rmq problem(KD-Tree)

    [BZOJ3489]A simple rmq problem(KD-Tree) 题面 BZOJ 题解 直接做肯定不好做,首先我们知道我们是一个二维平面数点,但是限制区间只能出现一次很不好办,那么我们给 ...

随机推荐

  1. git正确的删除远程仓库的文件并用.gitignore忽略提交此文件

    我向远程仓库提交了如下文件src/ pom.xml target/ WebContent/,发现没必要提交target目录. 于是做了如下操作: git rm -r --cached target g ...

  2. sort 命令详解

    sort  作用:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序  参数: -b 忽略每行前面开始出的空格字符. -c 检查文件是否已经按照顺序排序. -d 排序时,处理英文字 ...

  3. rmdir 命令详解

    rmdir  作用:  用来删除空目录, 当目录不再被使用时, 或者磁盘空间已达到使用限定值, 就需要删除失去价值的目录. 利用rmdir 命令可以从一个目录中删除一个或多个空的子目录. 该命令从一个 ...

  4. Ubuntu16.04 添加 Docker用户组

    Ubuntu16.04 添加 Docker用户组 将用户添加到docker用户组就不用每次都 sudo了. ### 首先创建用户组 sudo groupadd docker 将用户加如组 sudo g ...

  5. Oracle绑定变量优缺点

    参考:http://f.dataguru.cn/thread-208881-1-1.html 参考:http://blog.sina.com.cn/s/blog_4d9ece9a0100caw8.ht ...

  6. vue2.0表单事件的绑定

    v-model 1.input type="text" <template> <div id="app"> <label for= ...

  7. SqlServer Partition 分区表

    分区表     测试版本:        Microsoft SQL Server 2014 - 12.0.2000.8 (X64)     Feb 20 2014 20:04:26     Copy ...

  8. linux系统常见压缩命令

    在linux环境中,压缩文件的扩展名基本是:*.tar,*.tar.gz,*.tgz,*.gz,*.Z,*.bz2 *.Z compress程序压缩的文件 *.gz gzip程序压缩的文件 *.bz2 ...

  9. 分布式文件系统FastDFS详解

    上一篇文章<一次FastDFS并发问题的排查经历>介绍了一次生产排查并发问题的经历,可能有些人对FastDFS不是特别的了解,因此计划写几篇文章完整的介绍一下这个软件. 为什么要使用分布式 ...

  10. Struts2内部执行过程

    首先是Struts2的流程图. 一.当有一个请求的时候.执行以下流程. 1 客户端初始化一个指向Servlet容器的请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做Act ...