#P1955. Rubik's Cube
Rubik's Cube
题目描述:
背景
在翻找童年的旧物时,你发现了一个旧玩具,你认出它就是著名的魔方。在摆弄它的时候,你不得不承认,这么多年来,你解开这个谜题的能力一点都没有提高。但由于你一直都想弄明白这个东西,而且此刻你能做的另一件事就是准备一场考试,所以你决定试一试。幸运的是,你女朋友的哥哥是个魔方高手,无论魔方被打乱成什么样子,他都能复原。问题是他大部分时间都和他的女朋友待在荷兰,所以你需要一个适合远程学习的方法。你决定编写一个程序,这个程序能够记录魔方的状态以及需要转动的步骤。
问题
一个魔方表面覆盖着 个被称为小面的正方形区域,它的六个面中每个面都有 个小面。每个小面都有一种特定的颜色。通常当魔方处于初始状态时,属于同一个面的所有小面都具有相同的颜色。对于最初的魔方来说,这些颜色分别是红色、黄色、绿色、蓝色、白色和橙色。
小面的位置可以通过转动魔方的各个面来改变。这样做会将九个 “小立方体” 连同它们所附着的小面一起移动到一个新的位置(见图 1)。
问题在于确定在以不同方向转动魔方的不同面之后,整个魔方的小面是如何着色的。
输入:
第一行包含测试用例的数量。每个测试用例由两个部分组成。第一部分描述魔方的初始状态,第二部分描述要进行的转动操作。初始状态描述了小面的颜色以及它们的位置。颜色用单个字符来标识,每个小面对应一个字符。字符之间用空格隔开,并按照特定的模式排列(见图 2)。这种模式标识了魔方的所有六个面,可以将其看作是一种折叠模式。如图 2 所示,魔方顶面的描述位于前面描述的正上方。这是通过用空格缩进各行来实现的。接下来的三行包含了左面、前面、右面和后面的描述,如图 2 所示。这些描述简单地连接在一起,用一个空格字符作为分隔符。在那之后是底面的描述,使用与顶面描述相同的格式。这样就完成了对初始状态的描述。然后是测试用例的第二部分,包含了必须执行的转动操作。转动操作的描述以一行包含转动次数 的内容开始。每次转动都单独占一行,由两个整数值 和 组成,它们之间用一个空格隔开。第一个值 确定了必须转动的魔方面。各个面按顺序编号如下:左面为 ,前面为 ,右面为 ,后面为 ,顶面为 ,底面为 。第二个值 确定了转动的方向。
面 必须转动,且 的值可以是 或者 。 表示顺时针转动, 表示逆时针转动。这里所说的转动方向,是基于观察者正对着魔方的特定面来确定的。
输出:
对于每个测试用例的输出,首先是一行包含 “Scenario #i:” 的内容,其中 是测试用例的编号,从 开始。在这一行之后,使用与输入相同的格式打印出魔方最终的状态。每个测试用例都以一个空行结束。
输入数据1
2
w w w
w w w
w w w
r r r g g g b b b o o o
r r r g g g b b b o o o
r r r g g g b b b o o o
y y y
y y y
y y y
2
3 1
0 -1
g b b
g w w
g w w
r r r y g g b b y o o w
r r r y g g b b y o o w
w w w r g g b b y o o b
o y y
o y y
o r r
2
0 1
3 -1
输出数据1
Scenario #1:
g b b
g w w
g w w
r r r y g g b b y o o w
r r r y g g b b y o o w
w w w r g g b b y o o b
o y y
o y y
o r r
Scenario #2:
w w w
w w w
w w w
r r r g g g b b b o o o
r r r g g g b b b o o o
r r r g g g b b b o o o
y y y
y y y
y y y
来源:
2002 年德国达姆施塔特工业大学编程竞赛