在一塊 N x N 的棋盤 board 上,從棋盤的左下角開始,每一行交替方向,按從 1 到 N*N 的數字給方格編號。例如,對於一塊 6 x 6 大小的棋盤,可以編號如下:
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/snakes-and-ladders
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
————————
解題思路:使用廣度優先遍歷,每一次最多隻能前進六步,因爲骰子的值爲1-6之間。如果行進到的board的值不爲0,則跳到board值指定的位置。
因爲是蛇梯棋,每一層和下一層的位移方向是相反的,所以這是唯一需要注意的一點。
其Python代碼如下:
class Solution(object):
def snakesAndLadders(self, board):
N = len(board) # 每一層最多有幾個數字,N的作用是用於經過多少個數字則換行
def get(s):
quot, rem = divmod(s-1, N) # 返回s-1除於N的商和餘數
row = N - 1 - quot # 判斷當前數字在第幾行
col = rem if row%2 != N%2 else N - 1 - rem # 判斷當前行數和最後一組行數之差是否是2的倍數
return row, col
dist = {1: 0} # 用於存放已經掃描過的點,其中的value表示走的第幾步
queue = collections.deque([1]) # 建立一個隊列
while queue:
s = queue.popleft()
if s == N*N: # 如果走到了終點,則返回字典中對應的value值
return dist[s]
for s2 in range(s+1, min(s+6, N*N) + 1): # 每次最多可以走6步,但是同時注意不能超出圖的最大值,也就是N*N
r, c = get(s2) # 獲得其在board中實際對應的值
if board[r][c] != -1: # 如果行進到的位置不是-1,則跳到對應的位置
s2 = board[r][c]
if s2 not in dist:
dist[s2] = dist[s] + 1
queue.append(s2)
return -1