#P1955. Rubik's Cube

    ID: 956 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>模拟图结构TUD Programming Contest 2002DarmstadtGermany

Rubik's Cube

题目描述:

背景

在翻找童年的旧物时,你发现了一个旧玩具,你认出它就是著名的魔方。在摆弄它的时候,你不得不承认,这么多年来,你解开这个谜题的能力一点都没有提高。但由于你一直都想弄明白这个东西,而且此刻你能做的另一件事就是准备一场考试,所以你决定试一试。幸运的是,你女朋友的哥哥是个魔方高手,无论魔方被打乱成什么样子,他都能复原。问题是他大部分时间都和他的女朋友待在荷兰,所以你需要一个适合远程学习的方法。你决定编写一个程序,这个程序能够记录魔方的状态以及需要转动的步骤。

问题

一个魔方表面覆盖着 5454 个被称为小面的正方形区域,它的六个面中每个面都有 99 个小面。每个小面都有一种特定的颜色。通常当魔方处于初始状态时,属于同一个面的所有小面都具有相同的颜色。对于最初的魔方来说,这些颜色分别是红色、黄色、绿色、蓝色、白色和橙色。

小面的位置可以通过转动魔方的各个面来改变。这样做会将九个 “小立方体” 连同它们所附着的小面一起移动到一个新的位置(见图 1)。

问题在于确定在以不同方向转动魔方的不同面之后,整个魔方的小面是如何着色的。

输入:

第一行包含测试用例的数量。每个测试用例由两个部分组成。第一部分描述魔方的初始状态,第二部分描述要进行的转动操作。初始状态描述了小面的颜色以及它们的位置。颜色用单个字符来标识,每个小面对应一个字符。字符之间用空格隔开,并按照特定的模式排列(见图 2)。这种模式标识了魔方的所有六个面,可以将其看作是一种折叠模式。如图 2 所示,魔方顶面的描述位于前面描述的正上方。这是通过用空格缩进各行来实现的。接下来的三行包含了左面、前面、右面和后面的描述,如图 2 所示。这些描述简单地连接在一起,用一个空格字符作为分隔符。在那之后是底面的描述,使用与顶面描述相同的格式。这样就完成了对初始状态的描述。然后是测试用例的第二部分,包含了必须执行的转动操作。转动操作的描述以一行包含转动次数 t(t>0t(t>0)的内容开始。每次转动都单独占一行,由两个整数值 ssdd 组成,它们之间用一个空格隔开。第一个值 ss 确定了必须转动的魔方面。各个面按顺序编号如下:左面为 0“0”,前面为 1“1”,右面为 2“2”,后面为 3“3”,顶面为 4“4”,底面为 5“5”。第二个值 dd 确定了转动的方向。

ss 必须转动,且 dd 的值可以是 11 或者 1-111 表示顺时针转动,1-1 表示逆时针转动。这里所说的转动方向,是基于观察者正对着魔方的特定面来确定的。

输出:

对于每个测试用例的输出,首先是一行包含 “Scenario #i:” 的内容,其中 ii 是测试用例的编号,从 11 开始。在这一行之后,使用与输入相同的格式打印出魔方最终的状态。每个测试用例都以一个空行结束。

输入数据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 年德国达姆施塔特工业大学编程竞赛