蛇梯棋
题目链接: https://leetcode.cn/problems/snakes-and-ladders
解题思路:
从1开始遍历到n*n,每个数字代表棋盘的一个位置,通过数字可以计算出这个位置的行号以及列号
通过行号可以判断是从左到右遍历还是从右到左遍历
从该数字开始往后推算接下来的6个数字对应的棋盘位置,以及上面是否有蛇或梯子,判断出若下一步走这个位置最终能到棋盘的哪个位置
并将每个位置的下一个位置及到该位置使用的步数存入队列,再按照步骤3遍历队列里的元素
直至到终点
type edge struct {
id int
stepNum int
}
func snakesAndLadders(board [][]int) int {
n := len(board)
visited := make([]bool, n*n+1)
queue := []edge{{1, 0}}
for len(queue) > 0 {
item := queue[0]
queue = queue[1:]
for i:=1;i<=6;i++{
next := item.id + i
if next > n*n {
break
}
row, col := findIdRowAndCol(next, n)
if board[row][col] > 0 {
next = board[row][col]
}
if next == n*n {
return item.stepNum+1
}
if !visited[next] {
visited[next] = true
queue = append(queue, edge{id: next, stepNum: item.stepNum + 1})
}
}
}
return -1
}
func findIdRowAndCol(id, n int) (row, col int) {
// 根据每个点的id计算所在的行和列,奇数行从右到左遍历行
row, col = (id-1)/n, (id-1)%n
if row%2 == 1 {
col = n - 1 - col
}
row = n - 1 - row
return
}
复杂度分析
时间复杂度: 时间复杂度为,为
board
的边长空间复杂度: 空间复杂度为,为
board
的边长
最后更新于
这有帮助吗?