【leetcode】909. Snakes and Ladders

题目如下:

解题思路:天坑题,不在于题目多难,而是要理解题意。题目中有两点要特别注意,一是“You choose a destination square S with number x+1x+2x+3x+4x+5, or x+6, provided this number is <= N*N.” 这里最大可以移动的x+6中的6真的就是数字6啊,不是例子中的N=6的6,可以理解成是掷骰子。二是“Note that you only take a snake or ladder at most once per move: if the destination to a snake or ladder is the start of another snake or ladder, you do not continue moving. ” 这里的意思是不能连续坐梯子,例如如果一个数字是通过梯子到达的,那么即使这个数字本身有梯子,也不能继续坐了,必须移动x+1~x+6中的某一步。理解了题意后,其实这题就非常简单了,DFS或者BFS都行。

代码如下:

class Solution(object):
    def getLadderDestination(self,v,N):
        for i in range(1,N+1):
            if v <= i*N:
                break
        r = N-i
        if (i) % 2 == 1:
            c = v - ((i-1)*N + 1)
        else:
            c = i*N - v
        return (r,c)

    def snakesAndLadders(self, board):
        """
        :type board: List[List[int]]
        :rtype: int
        """
        N = len(board)
        #endPosition = None
        if N % 2 == 0:
            endPosition = (0,0)
        else:
            endPosition = (0,N-1)
        visit = [[N*N+1] * N for i in range(N)]
        queue = [(1,0)]
        visit[N-1][0] = 0
        while len(queue) > 0:
            v,step = queue.pop(0)
            #x,y = self.getLadderDestination(v,N)
            #visit[x][y] = min(visit[x][y],step)
            for i in range(v+1,min(N*N,v+6)+1):
                x,y = self.getLadderDestination(i,N)
                if board[x][y] > 0:
                    ladder_x, ladder_y = self.getLadderDestination(board[x][y], N)
                    if board[ladder_x][ladder_y] == 44:
                        pass
                    if visit[ladder_x][ladder_y] > step + 1:
                        queue.append((board[x][y], step + 1))
                        visit[ladder_x][ladder_y] = min(step + 1, visit[ladder_x][ladder_y])
                elif visit[x][y] > step+1:
                    queue.append((i, step + 1))
                    visit[x][y] = min(visit[x][y],step+1)
        #print visit
        return visit[endPosition[0]][endPosition[1]] if visit[endPosition[0]][endPosition[1]] != N*N+1 else -1

 

posted @ 2018-09-25 13:01  seyjs  阅读(905)  评论(0编辑  收藏  举报