leetcode —— 909. 蛇梯棋

在一塊 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章