zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    HDU 1104 Remainder (POJ 2426 BFS+数论)
    POJ 1398 Complete the sequence! ★ (差分)
    POJ 2917 Diophantus of Alexandria ★(数论)
    POJ 1948 Triangular Pastures (二维01背包)
    POJ 1948 Triangular Pastures (二维01背包)
    starter kits 介绍
    starter kits 介绍
    信息分析与预测复习题(绪论)
    信息分析与预测复习题(绪论)
    starter kits 介绍
  • 原文地址:https://www.cnblogs.com/seyjs/p/9694747.html
Copyright © 2011-2022 走看看