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. 并行cmd

    #!/bin/bash ]; then echo -e "usage : \n\t$0 hostList REMOTE_CMD" echo -e "example: \n ...

  2. c语言库函数测试

    1.函数名: abort功  能: 异常终止一个进程用  法: void abort(void);程序例: #include <stdio.h> #include <stdlib.h ...

  3. BZOJ4970 IOI2004 empodia障碍段

    4970: [ioi2004]empodia 障碍段 Time Limit: 10 Sec  Memory Limit: 128 MB Description 古数学及哲学家毕氏相信自然之本质为数学. ...

  4. 记vue API 知识点

    1. v-cloak指令:这个指令保持在元素上直到关联实例结束编译.和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标 ...

  5. RSA,DES,RC4,3DES ,MD5

    一,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥. RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需 ...

  6. 编译TensorFlow源码

      编译TensorFlow源码 参考: https://www.tensorflow.org/install/install_sources https://github.com/tensorflo ...

  7. Web API系列之一 Rest简介

    1.REST:Representational State Transfer表征状态转移,是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格.REST设计风格有如下几点: ...

  8. Java中堆与栈

    简单的说:Java把内存划分成两种:一种是栈内存,一种是堆内存. 1:什么是堆内存: 堆内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时 ...

  9. 轮播插件、原生js编写,弄懂这个,基本上各种轮播都可以自己写了

    直接上代码了: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  10. [转]Android sharedpreferences使用

    1.    SharedPerferences保存的数据主要是类似配置信息格式的数据,因此它保存的数据主要是简单类型的key-value对,SharedPreferences本身并没有写入数据的能力, ...