二维矩阵广度优先搜索
导言
- 以下代码都存放于 我的GitHub仓库 ,如果小伙伴觉得有用,请给我颗星星哈。
- 以下代码都是提交过的,正确性可以保证。
1. 框架
type Node struct {
x, y int
}
var dx []int
var dy []int
func BFSCaller() {
}
func BFS(){
level := 0
for len(queue) != 0 {
size := len(queue)
for size != 0{
size--
top := queue[0]
queue = queue[1:]
for {
}
}
level++
}
}
2. 实例
2.1 岛屿数量
传送门
type Node struct {
x, y int
}
var dx []int
var dy []int
func numIslands(grid [][]byte) int {
if len(grid) == 0 {
return 0
}
dx = []int{0, 0, 1, -1}
dy = []int{1, -1, 0, 0}
m, n := len(grid), len(grid[0])
ans := 0
queue := make([]Node, 0)
for i := 0; i < m; i++ {
for t := 0; t < n; t++ {
if grid[i][t] == '1' {
ans++
queue = append(queue, Node{i, t})
BFS(grid, queue)
}
}
}
return ans
}
func BFS(grid [][]byte, queue []Node) {
for len(queue) != 0 {
size := len(queue)
for size != 0 {
size --
top := queue[0]
queue = queue[1:]
if top.x < 0 || top.y < 0 || top.x >= len(grid) || top.y >= len(grid[top.x]) || grid[top.x][top.y] == '0' {
continue
}
grid[top.x][top.y] = '0'
for i := 0; i < len(dx); i++ {
nx, ny := top.x+dx[i], top.y+dy[i]
queue = append(queue, Node{nx, ny})
}
}
}
}
2.2 01矩阵
传送门
type Node struct {
x, y int
}
var dx []int
var dy []int
var hasBeenHandled map[int]bool
func updateMatrix(matrix [][]int) [][]int {
if len(matrix) == 0 {
return matrix
}
hasBeenHandled = make(map[int]bool)
dx = []int{0, 0, -1, 1}
dy = []int{1, -1, 0, 0}
m, n := len(matrix), len(matrix[0])
queue := make([]Node, 0, m*n)
for i := 0; i < m; i++ {
for t := 0; t < n; t++ {
if matrix[i][t] == 0 {
queue = append(queue, Node{i, t})
}
}
}
BFS(matrix, queue)
return matrix
}
func BFS(matrix [][]int, queue []Node) {
level := 0
for len(queue) != 0 {
size := len(queue)
for size != 0 {
size --
top := queue[0]
queue = queue[1:]
hashNumber := hash(top.x, top.y)
if top.x < 0 || top.y < 0 || top.x >= len(matrix) || top.y >= len(matrix[top.x]) || hasBeenHandled[hashNumber] {
continue
}
hasBeenHandled[hashNumber] = true
matrix[top.x][top.y] = level
for i := 0; i < len(dx); i++ {
nx, ny := top.x+dx[i], top.y+dy[i]
queue = append(queue, Node{nx, ny})
}
}
level++
}
}
func hash(x, y int) int {
return (x << 20) | y
}
2.3 腐烂的橘子
传送门
type Node struct {
x, y int
}
var dx []int
var dy []int
var hasBeenHandled map[int]bool
func orangesRotting(grid [][]int) int {
dx = []int{0, 0, 1, -1}
dy = []int{1, -1, 0, 0}
hasBeenHandled = make(map[int]bool)
goodOrangeCount := 0
queue := make([]Node, 0)
for i := 0; i < len(grid); i++ {
for t := 0; t < len(grid[i]); t++ {
if grid[i][t] == 2 {
queue = append(queue, Node{i, t})
}
if grid[i][t] == 1 {
goodOrangeCount++
}
}
}
return BFS(grid, queue, goodOrangeCount)
}
func BFS(grid [][]int, queue []Node, goodOrangeCount int) int {
if goodOrangeCount == 0 {
return 0
}
minutes := 0
for len(queue) != 0 {
size := len(queue)
for size != 0 {
size--
top := queue[0]
queue = queue[1:]
x, y := top.x, top.y
if x < 0 || y < 0 || x >= len(grid) || y >= len(grid[x]) {
continue
}
if hasBeenHandled[hash(x, y)] || grid[x][y] == 0 {
continue
}
hasBeenHandled[hash(x, y)] = true
if grid[x][y] == 1 {
goodOrangeCount--
if goodOrangeCount == 0 {
return minutes
}
}
grid[x][y] = 2
for i := 0; i < len(dx); i++ {
nx, ny := x+dx[i], y+dy[i]
queue = append(queue, Node{nx, ny})
}
}
minutes++
}
return -1
}
func hash(x, y int) int {
return (x << 10) | y
}
3. 注意
4. 练习题