47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
class Solution:
|
|
def snakesAndLadders(self, board: List[List[int]]) -> int:
|
|
ans = 0
|
|
n = len(board)
|
|
n = n - 1
|
|
length = n + 1
|
|
que = [(1,0)]
|
|
idx = 0
|
|
flag = [0 for i in range((n+1)*(n+1))]
|
|
def add_node(que, idx, node):
|
|
if len(que) <= idx:
|
|
que.append(node)
|
|
else:
|
|
que[idx] = node
|
|
def move(idx):
|
|
row = 0
|
|
column = idx % (n + 1)
|
|
if idx % (n + 1) == 0: row -= 1
|
|
row += idx // (n + 1)
|
|
row = n - row
|
|
oe = idx // (n + 1) % 2
|
|
if idx % (n + 1) == 0: oe = 1 - oe
|
|
if column == 0: column = n + 1
|
|
column -= 1
|
|
if oe == 1: column = n - column
|
|
return (row, column)
|
|
front = 0
|
|
while idx - front >= 0:
|
|
node = que[front]
|
|
front += 1
|
|
step = node[1]
|
|
cur_loc = node[0]
|
|
if flag[cur_loc] == 1: continue
|
|
flag[cur_loc] = 1
|
|
if cur_loc + 6 >= length * length:
|
|
return step + 1
|
|
for i in range(1, 7):
|
|
(row, column) = move(i + cur_loc)
|
|
if board[row][column]!= -1:
|
|
if board[row][column] == length * length: return step + 1
|
|
idx += 1
|
|
add_node(que, idx, (board[row][column], step + 1))
|
|
else:
|
|
idx += 1
|
|
add_node(que, idx, (i + cur_loc, step + 1))
|
|
return -1
|