#P1872. A Dicey Problem

A Dicey Problem

描述

图1中的3×3阵列是一个迷宫。需要通过迷宫需要一个标准的六面骰子(标准六面骰子的布局如图2所示)。每个迷宫都有一个初始位置和初始骰子配置。在图1中,起始位置是第1行第2列——迷宫顶行的“2”——初始骰子配置为“5”朝上,“1”朝向玩家(假设玩家从图的底部边缘观察迷宫)。
要通过迷宫,必须将骰子沿一条边倾斜到相邻的方格,实现从一个方格到另一个方格的水平或垂直移动。然而,只能移动到与移动前骰子顶部显示数字相同的方格,或移动到包含星号的“万能”方格。移动到万能方格总是允许的,无论骰子顶部当前显示的数字是什么。迷宫的目标是将骰子移出起始方格,然后找到返回同一方格的路径。

例如,在迷宫开始时有两种可能的移动。由于骰子顶部是5,可以向下移动一格;而由于起始位置左侧的方格是万能的,也可以向左移动。如果第一次选择向下移动,这将使6朝上,此时可以向右或向下移动。如果第一次选择向左移动,这将使3朝上,此时无法继续移动。

如果将迷宫位置表示为行和列的有序对(行, 列),行索引从顶部的第1行开始向下递增,列索引从左边的第1列开始向右递增,那么这个简单迷宫的解可以表示为:(1,2), (2,2), (2,3), (3,3), (3,2), (3,1), (2,1), (1,1), (1,2)。图3展示了一个更具挑战性的迷宫示例。

本问题的目标是编写一个程序来解决骰子迷宫。输入文件将包含多个迷宫,程序需要为这些迷宫寻找解。每个迷宫要么有唯一解,要么无解。也就是说,输入中的每个迷宫可能有解或无解,但有解的迷宫保证只有一个唯一解。对于每个输入迷宫,输出解或表示无解的消息。

输入

输入文件的第一行是一个不超过20个非空字符的字符串,表示第一个迷宫的名称。下一行包含六个用空格分隔的整数。这些整数依次是:迷宫的行数(1到10的整数,记为RR)、迷宫的列数(1到10的整数,记为CC)、起始行、起始列、骰子在起始位置时顶部的数字,以及骰子在起始位置时朝向玩家的数字。接下来的R行每行包含CC个用空格分隔的整数。这个R×C的整数数组定义了迷宫。值为0表示迷宫中的空位置(例如图3中中心列的两个空方格),值为-1表示万能方格。对输入中的每个迷宫重复此输入序列。以仅包含“END”(不带引号)作为迷宫名称的行标记输入结束。

输出

输出应包含每个迷宫的名称,后跟其解或字符串“No Solution Possible”(不带引号)。除迷宫名称外,输出文件中的所有行应缩进两个空格。迷宫名称应从最左列开始。解应输出为连续遍历位置的逗号分隔序列,从起始方格开始并结束于同一方格(输入中指定的起始方格)。位置应表示为括号括起来的有序对。解应每行列9个位置(最后一行可能不足9个位置),位置之间或内部不应有空格。

输入数据 1

DICEMAZE1
3 3 1 2 5 1
-1 2 4
5 5 6
6 -1 -1
DICEMAZE2
4 7 2 6 3 6
6 4 6 0 2 6 4
1 2 -1 5 3 6 1
5 3 4 5 6 4 2
4 1 2 0 3 -1 6
DICEMAZE3
3 3 1 1 2 4
2 2 3
4 5 6
-1 -1 -1
END

输出数据 2

DICEMAZE1
  (1,2),(2,2),(2,3),(3,3),(3,2),(3,1),(2,1),(1,1),(1,2)
DICEMAZE2
  (2,6),(2,5),(2,4),(2,3),(2,2),(3,2),(4,2),(4,1),(3,1),
  (2,1),(2,2),(2,3),(2,4),(2,5),(1,5),(1,6),(1,7),(2,7),
  (3,7),(4,7),(4,6),(3,6),(2,6)
DICEMAZE3
  No Solution Possible