滾石柱
描述
迷宮是一個N行M列的矩陣,每個位置可能是硬地(用”.”表示)、易碎地面(用”E”表示)、禁地(用”#”表示)、起點(用”X”表示)或終點(用”O”表示)。
在每一步操作中,可以按上下左右四個鍵之一。
按下按鍵之後,石柱向對應的方向沿着棱滾動90度。
任意時刻,長方體不能有任何部位接觸禁地,並且不能立在易碎地面上。
字符”X”標識長方體的起始位置,地圖上可能有一個”X”或者兩個相鄰的”X”。
地圖上唯一的一個字符”O”標識目標位置。
求把石柱移動到目標位置(即立在”O”上)所需要的最少步數。
在移動過程中,”X”和”O”標識的位置都可以看作是硬地被利用。
輸入
輸入包含多組測試用例。
對於每個測試用例,第一行包括兩個整數N和M。
接下來N行用來描述地圖,每行包括M個字符,每個字符表示一塊地面的具體狀態。
當輸入用例N=0,M=0時,表示輸入終止,且該用例無需考慮。
3≤N,M≤500
輸出
每個用例輸出一個整數表示所需的最少步數,如果無解則輸出”Impossible”。
每個結果佔一行。
輸入樣例
7 7
#######
#..X###
#..##O#
#....E#
#....E#
#.....#
#######
0 0
輸出樣例
10
題解
如何設計數據結構?
在每一步操作中,可以按上下左右四個鍵之一
按下鍵後,石柱向對應的方向沿着棱滾動90度
如何設計石柱的狀態轉移函數!
任意時刻,長方體不能有任何部位接觸禁地,並且不能立在易碎地上
-------如何設計isvalid()函數
字符‘x’標識長方體的起始位置,地圖上可能有一個‘X’或者兩個相鄰的’X‘
-------如何表示Start點
地圖上唯一的一個字符’O‘標識目標位置
-------Target點如何表示
求石柱移動到目標位置(即立在’O‘上)所需的最小步數
-------結束狀態如何表示
在移動過程中,'X’和’O’b標識的位置可以看成硬地來使用
--------如何更新地圖
石柱採用三元主(X,Y,Status)
(X,Y) 表示石柱的基座標
Status: 0表示站立,1表示橫躺,2表示豎躺
(X,Y,Status狀態轉移表)
難度
高,BFS
代碼
code by andy