移动木块
时间限制:1秒 内存限制:256M
【题目描述】
在计算机科学中的很多地方都会使用简单,抽象的方法来做分析和实验验究。比如在早期的规划学和机器人学的人工智能研究就利用一个积木世界,让机械臂执行操作积木的任务。
在这个问题中,你将在确定的规则和约束条件下构建一个简单的积木世界。这不是让你来研究怎样达到某种状态,而是编写一个“机械臂程序”来响应有限的命令集。
问题就是分析一系列的命令,告诉机械臂如何操纵放在一个平台上的积木。最初平台上有n个积木(编号由0到n-1),对于任意的 \(0≤i<n-1\),积木 b[i] 都与 b[i+1] 相邻,图示如下:
机械臂操作积木的有效指令列举如下:
1、move a onto b :先将 a 和 b 上面所有的积木都放回原处,再将 a 放在 b 上。
2、move a over b :先将 a 上面所有的积木放回原处,再将 a 放在 b 上( b 上原有积木不动)。
3、pile a onto b :将 a 和其上面所有的积木组成的一摞整体移动到 b 上。在移动前要先将 b 上面所有的积木都放回原处。移动的一摞积木要保持原来的顺序不变。
4、pile a over b :将 a 和其上面所有的积木组成的一摞整体移动到 b 所在一摞积木的最上面一个积木上。移动的一摞积木要保持原来的顺序不变。
5、quit :结束积木世界的操纵。
当 a = b 或 a 和 b 处在同一摞时,任何企图操作 a 和 b 的命令都是非法的。所有非法的命令都要忽略,且不能对当前积木的状态产生作用。
【输入格式】
由 1 个整数 \(n\) 开始开始,该整数独占一行,表示积木世界中的积木数量。你可以假定。从积木数量值的下一行开始是一系列的命令,每条命令独占一行。你的程序要处理所有的命令直到输入退出命令。
你可以假定所有的命令都按上文所示的格式给出。不会出现语法错误的命令。
【输出格式】
以积木世界的最终状态作为输出。每一个原始积木的位置 \(i(0≤i<n\),\(n\) 为积木数量)后面都要紧跟一个冒号。如果至少有一个积木在该位置上,冒号后面都要紧跟一个空格,然后是该位置上所有积木编号的序列。每 2 个积木的编号之间以一个空格隔开。行尾不能出现多余的空格。每个积木位置独占一行(即第一行输入的 \(n\),对应输出 \(n\) 行数据)。
【输入输出样例】
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
Output
0:0
1:1 9 2 4
2:
3:3
4:
5:5 8 7 6
6:
7:
8:
9:
【数据限制】
对于 \(100\%\) 的数据,\(0 < n < 25\)。
【来源】
Mr.he