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

发布了320 篇原创文章 · 获赞 21 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37388085/article/details/105290421