Time Limit:3000MS     Memory Limit:0KB
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 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 ( 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:

题解:

1、这道题总共有四种堆积木的方法,(1)是move onto 就是将a,b上面的积木恢复到原来的位置。将a堆在b上。(2)是move over 就是将a上面的积木恢复到原来的位置,将a堆在b所在的那一摞积木的最上面。(3)是pile onto 就是将b上面的积木恢复到原来的位置,将a及其上面的积木堆在b上。(4)pile over 就是将a及其上面的积木堆在b所在那一摞积木的最上面。

2、其实如果a,b上面都没有积木,那么pile onto、pile over 其实是和move onto、move over没有区别的,a,b上有积木,区别就在于是否需要将a或b上的积木恢复。所以可以拆分为小函数。(1)是函数restore(int c),将c上的积木恢复。(2)是函数pile(int a,int b)将a及其以上积木,堆在含有b那一摞积木的最上面。

3、那么四种方法可以简化为三步 ,(1)如果是move,那么就restore(a);(2)如果是onto 就restore(b);(3)最后pile(a,b)即可。

4、执行操作过程中,如果a==b 或者a和b在同一摞,则为无效指令,跳过即可,判断在islegal()中。

5、特别需要注意的是输出格式,最后一行的回车不可少,每一行每一个数字前面有一个空格,最后一个数字之后没有空格,不然算法是对了,但是PE就太忧伤了。

以下是代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int A[30][30],x,y,z,w;
char s1[10],s2[10];
int a,b,op,n;
void Find(int c,int &u,int &v){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(A[i][j]==c){ u=i;v=j;}
}
bool islegal(){
if(a==b)return 0;
Find(a,x,y);
Find(b,z,w);
if(x==z)return 0;
return 1;
}
void restore(int p){
Find(p,x,y);
while(A[x][++y]!=-1){
int t= A[x][y];
A[t][0]=t;
A[x][y]=-1;
}
}
void pile(int a,int b){
Find(a,x,y);
Find(b,z,w);
while(A[z][++w]!=-1);w--;
while(A[x][y]!=-1){
A[z][++w]=A[x][y];
A[x][y++]=-1;
}
}
int main(){
//freopen("1.in","r",stdin);
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)A[i][j]=-1;
A[i][0]=i;
}
while(scanf("%s",s1)!=EOF && s1[0]!='q'){
scanf("%d%s%d",&a,s2,&b);
if(islegal()==0)continue;
if(s1[0]=='m')restore(a);
if(s2[1]=='n')restore(b);
pile(a,b);
}
for(int i=0;i<n;i++){
printf("%d:",i);
int k=0;
while(A[i][k]!=-1)
printf(" %d",A[i][k++]);
printf("\n");
}
}

以下是测试数据:

sample input

10

move 6 on 5

move 4 over 8

pile 9 on 0

move 3 on 9

pile 1 on 9

move 1 over 0

pile 7 over 6

move 1 on 8

pile 5 on 3

move 2 on 5

quit

7

move 6 over 5

pile 3 on 0

pile 5 on 1

move 2 on 0

pile 0 on 1

move 0 over 2

move 1 over 1

move 5 over 3

pile 6 over 5

pile 3 over 1

quit

sample output

0: 0 9

1:

2:

3: 3 5 2

4: 4

5:

6: 6

7: 7

8: 8 1

9:

0:

1: 1 0 2 3 5 6

2:

3:

4: 4

5:

6:

Winter-2-STL-D The Blocks Problem 解题报告及测试数据的更多相关文章

  1. codeforces B. Routine Problem 解题报告

    题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...

  2. HDU p1294 Rooted Trees Problem 解题报告

    http://www.cnblogs.com/keam37/p/3639294.html keam所有 转载请注明出处 Problem Description Give you two definit ...

  3. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  4. [poj 2480] Longge's problem 解题报告 (欧拉函数)

    题目链接:http://poj.org/problem?id=2480 题目大意: 题解: 我一直很欣赏数学题完美的复杂度 #include<cstring> #include<al ...

  5. UVa第五章STL应用 习题((解题报告))具体!

    例题5--9 数据库 Database UVa 1592 #include<iostream> #include<stdio.h> #include<string.h&g ...

  6. 【LeetCode】365. Water and Jug Problem 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学题 相似题目 参考资料 日期 题目地址:http ...

  7. UOJ182 a^-1 + b problem 解题报告

    题目描述 有一个长度为\(n(n\le 10^5)\)的数列,在模\(M\)意义下进行\(m(m \le50000)\)次操作,每次操作形如以下两种形式: 1 \(x\) 表示每个数加\(x(0 \l ...

  8. codeforces 798C.Mike and gcd problem 解题报告

    题目意思:给出一个n个数的序列:a1,a2,...,an (n的范围[2,100000],ax的范围[1,1e9] ) 现在需要对序列a进行若干变换,来构造一个beautiful的序列: b1,b2, ...

  9. sgu 104 Little shop of flowers 解题报告及测试数据

    104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB 问题: 你想要将你的 ...

随机推荐

  1. CSS顶级技巧大放送,div+css布局必知

    字体大小使用px 在一行内声明CSS 对比下面两个: h2 {font-size:18px; border:1px solid blue; color:#000; } h2 {    font-siz ...

  2. u盘作为git仓库,完成不同地方的代码同步

    参考网上一篇 "把Git Repository建到U盘上去" 1.我经常有这样的需求,工作.家里需要对同一份代码或文档编辑,并希望在不同地方能同步: 如果是私密性不那么强,可以直接 ...

  3. python3----datetime模块分析

    datetime模块用于是date和time模块的合集,datetime有两个常量,MAXYEAR和MINYEAR,分别是9999和1. datetime模块定义了5个类,分别是 1.datetime ...

  4. P2483 [SDOI2010]魔法猪学院

    P2483 [SDOI2010]魔法猪学院 摘要 --> 题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世 ...

  5. iOS开发中多线程基础

    耗时操作演练 代码演练 编写耗时方法 - (void)longOperation { for (int i = 0; i < 10000; ++i) { NSLog(@"%@ %d&q ...

  6. iOS开发之--png图片编译时报错 (Command /Applications/Xcode.app/Contents/Developer/usr/bin/copypng failed with exit code 1 )

    编译或者运行APP的时候,老是报这个错误:Command /Applications/Xcode.app/Contents/Developer/usr/bin/copypng failed with ...

  7. vue2.0中子组件通过v-modal改变父组件中的值

    父组件代码: <template lang="pug"> div p this is father child(v-model="data") &l ...

  8. java 实现对指定目录的文件进行下载

    @RequestMapping("/exportDocument") @ResponseBody public void exportDocument(HttpServletReq ...

  9. jquery使用replaceWith替换元素,但是替换的位置不对应的问题

    $("#itemList").replaceWith(htmlContent); 注: $("#itemList")处应为tr元素,如果是span元素或者div ...

  10. html的table列表根据奇数还是偶数行显示不同颜色

    <tr <s:if test="#sts.even"> class="table_1" onMouseOut="this.class ...