update: leetcode 1034 solution && readme

This commit is contained in:
tphyhFighting
2021-12-09 12:53:23 +08:00
parent bda9f48034
commit 94c703c2d5
2 changed files with 52 additions and 58 deletions

View File

@ -5,49 +5,46 @@ type point struct {
y int y int
} }
var ( type gridInfo struct {
borders []point
m int m int
n int n int
vis [][]bool grid [][]int
dirs []point
q []point
originalColor int originalColor int
) }
func colorBorder(grid [][]int, row, col, color int) [][]int { func colorBorder(grid [][]int, row, col, color int) [][]int {
m, n = len(grid), len(grid[0]) m, n := len(grid), len(grid[0])
vis = make([][]bool, m) dirs := []point{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}
vis := make([][]bool, m)
for i := range vis { for i := range vis {
vis[i] = make([]bool, n) vis[i] = make([]bool, n)
} }
dirs = []point{{1, 0}, {-1, 0}, {0, 1}, {0, -1}} var borders []point
originalColor = grid[row][col] gInfo := gridInfo{
borders = []point{} m: m,
q = []point{{row, col}} n: n,
bfs(q, grid) grid: grid,
originalColor: grid[row][col],
}
dfs(row, col, gInfo, dirs, vis, &borders)
for _, p := range borders { for _, p := range borders {
grid[p.x][p.y] = color grid[p.x][p.y] = color
} }
return grid return grid
} }
func bfs(q []point, grid [][]int) { func dfs(x, y int, gInfo gridInfo, dirs []point, vis [][]bool, borders *[]point) {
for len(q) != 0 { vis[x][y] = true
ele := q[0] isBorder := false
vis[ele.x][ele.y] = true for _, dir := range dirs {
q = q[1:] nx, ny := x+dir.x, y+dir.y
isBorder := false if !(0 <= nx && nx < gInfo.m && 0 <= ny && ny < gInfo.n && gInfo.grid[nx][ny] == gInfo.originalColor) {
for _, dir := range dirs { isBorder = true
nx, ny := ele.x+dir.x, ele.y+dir.y } else if !vis[nx][ny] {
if !(0 <= nx && nx < m && 0 <= ny && ny < n && grid[nx][ny] == originalColor) { dfs(nx, ny, gInfo, dirs, vis, borders)
isBorder = true
} else if !vis[nx][ny] {
q = append(q, point{nx, ny})
}
}
if isBorder {
borders = append(borders, point{ele.x, ele.y})
} }
} }
if isBorder {
*borders = append(*borders, point{x, y})
}
} }

View File

@ -62,50 +62,47 @@ type point struct {
y int y int
} }
var ( type gridInfo struct {
borders []point
m int m int
n int n int
vis [][]bool grid [][]int
dirs []point
q []point
originalColor int originalColor int
) }
func colorBorder(grid [][]int, row, col, color int) [][]int { func colorBorder(grid [][]int, row, col, color int) [][]int {
m, n = len(grid), len(grid[0]) m, n := len(grid), len(grid[0])
vis = make([][]bool, m) dirs := []point{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}
vis := make([][]bool, m)
for i := range vis { for i := range vis {
vis[i] = make([]bool, n) vis[i] = make([]bool, n)
} }
dirs = []point{{1, 0}, {-1, 0}, {0, 1}, {0, -1}} var borders []point
originalColor = grid[row][col] gInfo := gridInfo{
borders = []point{} m: m,
q = []point{{row, col}} n: n,
bfs(q, grid) grid: grid,
originalColor: grid[row][col],
}
dfs(row, col, gInfo, dirs, vis, &borders)
for _, p := range borders { for _, p := range borders {
grid[p.x][p.y] = color grid[p.x][p.y] = color
} }
return grid return grid
} }
func bfs(q []point, grid [][]int) { func dfs(x, y int, gInfo gridInfo, dirs []point, vis [][]bool, borders *[]point) {
for len(q) != 0 { vis[x][y] = true
ele := q[0] isBorder := false
vis[ele.x][ele.y] = true for _, dir := range dirs {
q = q[1:] nx, ny := x+dir.x, y+dir.y
isBorder := false if !(0 <= nx && nx < gInfo.m && 0 <= ny && ny < gInfo.n && gInfo.grid[nx][ny] == gInfo.originalColor) {
for _, dir := range dirs { isBorder = true
nx, ny := ele.x+dir.x, ele.y+dir.y } else if !vis[nx][ny] {
if !(0 <= nx && nx < m && 0 <= ny && ny < n && grid[nx][ny] == originalColor) { dfs(nx, ny, gInfo, dirs, vis, borders)
isBorder = true
} else if !vis[nx][ny] {
q = append(q, point{nx, ny})
}
}
if isBorder {
borders = append(borders, point{ele.x, ele.y})
} }
} }
if isBorder {
*borders = append(*borders, point{x, y})
}
} }
``` ```