package q909 func coord(n, num int) (x, y int) { num -= 1 row := num / n y = n - row - 1 x = num % n if row%2 == 1 { x = n - 1 - x } return } func snakesAndLadders(board [][]int) int { n, sqN := len(board), len(board)*len(board) leastRolls := make([]int, sqN) if len(leastRolls) == 1 { return 0 } queue := make([]int, 0, sqN) queue = append(queue, 1) for ; len(queue) > 0; queue = queue[1:] { cur := queue[0] for dist := 1; dist <= 6 && cur+dist <= sqN; dist++ { next := cur + dist x, y := coord(n, next) if board[y][x] != -1 { next = board[y][x] } rolls := leastRolls[cur-1] + 1 if (next > 1 && leastRolls[next-1] == 0) || rolls < leastRolls[next-1] { leastRolls[next-1] = rolls if next == sqN { return rolls } queue = append(queue, next) } } } l := leastRolls[sqN-1] if l == 0 { return -1 } return 0 } var _ = snakesAndLadders