leetcode909. Snakes and Ladders
Posted seyjs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode909. Snakes and Ladders相关的知识,希望对你有一定的参考价值。
题目如下:
解题思路:天坑题,不在于题目多难,而是要理解题意。题目中有两点要特别注意,一是“You choose a destination square S
with number x+1
, x+2
, x+3
, x+4
, x+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
以上是关于leetcode909. Snakes and Ladders的主要内容,如果未能解决你的问题,请参考以下文章
[lightoj P1151] Snakes and Ladders
CodeChef Consecutive Snakes 三分(整数)
LeetCode 909 蛇梯棋[BFS] HERODING的LeetCode之路
LeetCode 815. 公交路线 / 909. 蛇梯棋(还是bfs)/ 168. Excel表列名称 / 171. Excel表列序号