The Blocks Problem(vector)
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 5004 | Accepted: 2119 |
Description
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
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
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)的更多相关文章
- 【UVA - 101】The Blocks Problem(vector+模拟)
The Blocks Problem Descriptions:(英语就不说了,直接上翻译吧) 初始时从左到右有n个木块,编号为0~n-1,要求实现下列四种操作: move a onto b: 把a和 ...
- Problem B The Blocks Problem(vector的使用)
题目链接:Problem B 题意:有n块木块,编号为0~n-1,要求模拟以下4种操作(下面的a和b都是木块编号) 1. move a onto b: 把a和b上方的木块全部归位,然后把a摞在b上面. ...
- 【CF954I】Yet Another String Matching Problem(FFT)
[CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...
- STL--向量(vector)
STL的组成 标准模板库STL关注的重点是泛型数据结构和算法,其关键组成部分是容器(containers).算法(algorithms).迭代器(iterators).函数对象(Function Ob ...
- R语言编程艺术# 数据类型向量(vector)
R语言最基本的数据类型-向量(vector) 1.插入向量元素,同一向量中的所有的元素必须是相同的模式(数据类型),如整型.数值型(浮点数).字符型(字符串).逻辑型.复数型等.查看变量的类型可以用t ...
- STL标准模板库 向量容器(vector)
向量容器使用动态数组存储.管理对象.因为数组是一个随机访问数据结构,所以可以随机访问向量中的元素.在数组中间或是开始处插入一个元素是费时的,特别是在数组非常大的时候更是如此.然而在数组末端插入元素却很 ...
- List接口的实现类(Vector)(与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多。)
LinkedList提供以下方法:(ArrayList无此类方法) addFirst(); removeFirst(); addLast(); removeLast(); 在堆栈中, ...
- R语言编程艺术#01#数据类型向量(vector)
R语言最基本的数据类型-向量(vector) 1.插入向量元素,同一向量中的所有的元素必须是相同的模式(数据类型),如整型.数值型(浮点数).字符型(字符串).逻辑型.复数型等.查看变量的类型可以用t ...
- 【BZOJ3489】A simple rmq problem(KD-Tree)
[BZOJ3489]A simple rmq problem(KD-Tree) 题面 BZOJ 题解 直接做肯定不好做,首先我们知道我们是一个二维平面数点,但是限制区间只能出现一次很不好办,那么我们给 ...
随机推荐
- xml生成方式二(Xml序列化器XmlSerializer)
一.andoirdAPI提供了xml生成和解析的API: XmlSerializer xs = Xml.newSerializer();和XmlPullParser xmlPullParser = X ...
- MST系列
1.POJ2485 Highways 蛮水的 数组一开始开小了卡了一会儿 我可能是个傻逼 #include<iostream> #include<cstdio> #includ ...
- bzoj 4289: PA2012 Tax
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- js的Date对象
1.构造Date对象 var dt = new Date(); //获取当地包含日期和时间的对象,格式为:Thu Aug 31 2017 09:15:43 GMT+0800 (中国标准时间) 2.使用 ...
- 阅读MDN文档之层叠与继承(二)
目录 The cascade Importance Specificity Source order A note on rule mixing Inheritance Controlling inh ...
- windows日志监控
bat脚本,主要作用,每个五分钟读取日文本件中新增内容,进行错误赛选,如果有错误信息,将错误信息用邮件发送给管理员. 其中awk和sed需要手动下载 :读取number.txt文档,获取上一次执行时文 ...
- unity demo之坦克攻击
先展示一下成果吧,节后第一天上班简直困爆了,所以一定要动下脑子搞点事情. 分析: 1.涉及到的游戏对象有:坦克,摄像机,场景素材(包含灯光),子弹 2.坦克具有的功能:移动,旋转,发射子弹,记录生命值 ...
- [编织消息框架][网络IO模型]Netty Reactor
严格来讲Netty Reactor是一种设计模式,一听模式两字就知道了吧,套路哈哈 Reactor中文译为“反应堆”. 看图netty处理流程 1.netty server 至少有两组reactor. ...
- jquery通过ajax查询数据动态添加到select
function addSelectData() { //select的id为selectId //清空select中的数据 $("#selectId").empty(); $.a ...
- kafka资料
https://www.cnblogs.com/the-tops/p/5685955.html