UVa101

The Blocks Problem

Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

Submit Status Practice UVA 101 uDebug

Description

Background

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

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 b i adjacent to block b i+1 for all  as shown in the diagram below:

Figure: Initial Blocks World

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.

The 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.

The Output

The output should consist of the final state of the blocks world. Each original block position numbered i (  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:

Miguel Revilla 
2000-04-06

这道题的题解引用自:http://blog.csdn.net/mobius_strip/article/details/12765319

题意:给你n个方块,有四种操作:

1.move a onto b,把a和b上面的方块都放回原来位置,然后把a放到b上面;

2.move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上面;

3.pile a onto b,把b上面的放回原来位置,然后把a和a上面的方块整体放到b上面;

4.pile a over b,把a和a上面的方块整体放到b所在堆的上面。

分析:模拟,数据结构。观察操作,如果是move就是先把a上面的还原,如果是onto就是先把b上面的还原。

然后,就是移动一堆到另一堆的上面(单个也认为是一堆)。所以设置两个基础操作:

1.将a上面的还原init_place(a);

2.将a和上面的(可以没有上面的)放到b上面pile_a_to_b(a,b)。

那么上述的四组操作就变成下面了:

1.move a onto b,init_place(a);init_place(b);pile_a_to_b(a,b);

2.move a over b,init_place(a);pile_a_to_b(a,b);

3.pile a onto b,init_place(b);pile_a_to_b(a,b);

4.pile a over b,pile_a_to_b(a,b)。

利用两个操作轻松解决。具体实现时设置一个place数组记录每个编号的方块对应的堆。

注意:如果a和b已经在一堆中就不要操作,此时认为不用移动,否则会WA。

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4
 5 using namespace std;
 6
 7 int place[25];
 8 int stack[25][25];
 9 int top[25];
10
11 //将a上面的放回原位
12 void init_place( int a )
13 {
14     int block,id = place[a];
15     while ( stack[id][top[id]] != a ) {
16         block = stack[id][top[id] --];
17         place[block] = block;
18         stack[block][++ top[block]] = block;
19     }
20 }
21
22 //将a和上面的全都移动到b上
23 int  temp[25];
24 void pile_a_to_b( int a, int b )
25 {
26     int topt = -1,id = place[a],ID = place[b];
27     //先将a上面的逆序存入temp
28     while ( stack[id][top[id]] != a )
29         temp[++ topt] = stack[id][top[id] --];
30     //再存入a
31     place[a] = ID;
32     stack[ID][++ top[ID]] = a;
33     top[id] --;
34     //最后将temp里面的逆序存入b
35     while ( topt >= 0 ) {
36         place[temp[topt]] = ID;
37         stack[ID][++ top[ID]] = temp[topt --];
38     }
39 }
40
41 int main()
42 {
43     int  n,a,b;
44     char oper[5],type[5];
45     while ( ~scanf("%d",&n) ) {
46         for ( int i = 0 ; i < n ; ++ i ) {
47             stack[i][0] = i;
48             place[i] = i;
49             top[i] = 0;
50         }
51         while ( scanf("%s",oper) && oper[0] != ‘q‘ ) {
52             scanf("%d%s%d",&a,type,&b);
53
54             //如果ab在同一堆,不处理
55             if ( place[a] == place[b] )
56                 continue;
57
58             //如果是move先把a上面的还原
59             if ( oper[0] == ‘m‘ )
60                 init_place( a );
61
62             //如果是onto先把b上面的还原
63             if ( type[1] == ‘n‘ )
64                 init_place( b );
65
66             //把A堆放在B堆上
67             pile_a_to_b( a, b );
68         }
69
70         for ( int i = 0 ; i < n ; ++ i ) {
71             printf("%d:",i);
72             int now = 0;
73             while ( now <= top[i] )
74                 printf(" %d",stack[i][now ++]);
75             printf("\n");
76         }
77     }
78     return 0;
79 }

时间: 2024-08-05 06:41:54

UVa101的相关文章

UVA101 HDU1612 POJ1208 The Blocks Problem

问题链接:UVA101 HDU1612 POJ1208 The Blocks Problem. 这是一个模拟题,程序过程都是套路. 程序中用到了STL的容器类vector. 这个程序在UVA和POJ中都AC,可是在HDU中是"Presentation Error". AC通过的C++语言程序如下: /* UVA101 HDU1612 POJ1208 The Blocks Problem */ #include <iostream> #include <string&g

UVA101 The Blocks Problem

 The Blocks Problem  Background Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AIstudy of planning and robotics (STRIPS) used a block world in which arobot arm performed ta

uva101木块问题The Blocks Problem

背景:一看这道题,再看书前面的知识点,我只能说一点不会,于是我将上面的代码在电脑上面打了一遍,这才会一点点新知识的运用,然后我就按照自己的想法,说实话已经参照了书上的一些东西,然后自己去用新知识写代码,当我满心欢喜的去测试的时候,啊,wrong,仔细一读题,才发现自己题意都理解错了. 思路:模拟四条指令即可.由于每个木块堆的高度不确定,所以用vector来保存很合适. 学习:vector就是一个不定长数组.若a是一个vector,可以用a.size()读取他的大小,用a.resize()改变他的

数据结构之vector UVa101

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 #include <vector> 6 7 using namespace std; 8 9 vector<int> arr[30]; 10 int x,y,n; 11 void find_blocks(int w) 12 { 13 for(x=0;x<n

【日常学习】STL之vector

本周四学习了vector 由于时间关系拖到现在才发总结 那么现在总结一些vector的常用用法 vector需要有一个名字 即数组名 因为vector本身就是一个不定长数组 我们以a为例 那么相当于建立了数组a[ ]但是没有给定长度 声明语法: 头文件vector vector<int> a 这个句子的意思是,建立一个名字为a的不定长数组 基类型为整数型  vector<int> a[31] 这个句子的意思是,建立一个下标从0-30的数组 每个数组元素都又是一个不定长数组 基类型为

10道ACM例题让你三天学会STL

清明节给大一的孩子们讲了点STL的应用,下了些功夫,搬到这里来供大家学习交流. 1.泛型程序设计简介与迭代器的介绍 2.常见的STL容器及其例题应用(UVA10474,UVA101,UVA10815,UVA156,UVA540,UVA136 HDU1027,CF501B,HDU1716,HDU4277) 3.相关练习和思路 1.泛型程序设计简介与迭代器的介绍 1.1 泛型程序设计简介 泛型程序设计,简单地说就是使用模板的程序设计法.将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,

算法竞赛入门经典5.2 STL初步

1. 排序和检索,学会使用sort排序,以及low_bound函数 Raju and Meena love to play with Marbles. They have got a lot of marbles with numbers written on them. At the beginning, Raju would place the marbles one after another in ascending order of the numbers written on the

2019年8月做题记录

codeforces1199C codeforces1198B codeforces1197A codeforces1197B codeforces1197C codeforces1197D codeforces1198C codeforces1201A codeforces1201B codeforces1201C codeforces1189A codeforces1189B codeforces1189C codeforces1189D1 codeforces1189E codeforce