-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path130.surrounded-regions.go
More file actions
68 lines (63 loc) · 1.69 KB
/
130.surrounded-regions.go
File metadata and controls
68 lines (63 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
* @lc app=leetcode id=130 lang=golang
*
* [130] Surrounded Regions
*/
// 28 ms 99.22%
//思路错误,DFS染色会有错误,导致不应该染色的点染色了 [["X","X","X","X"],["X","O","O","X"],["X","O","O","X"],["X","O","X","X"]]
// 思路转换,先把不符合要求的点标记成别的元素,然后再恢复回来
// 1.首先不由左上到右下找第一个O元素,改成从四周找O,并DFS将其变成第三个元素*,
// 2.然后遍历所有元素,将O -> X
// 3.最后将所有 * -> O,流程结束
func solve(board [][]byte) {
// 染色问题,BFS队列实现
rows := len(board) //
if rows == 0 {
return
}
cols := len(board[0])
// 遍历边缘元素
for i:=0; i<rows; i++{
if board[i][cols-1] == 'O'{ // O->*
solveDFS(&board, i, cols-1, rows, cols)
}
if board[i][0] == 'O'{ // O->*
solveDFS(&board, i, 0, rows, cols)
}
}
for j:=0; j<cols; j++{
if board[rows-1][j] == 'O'{ // O->*
solveDFS(&board, rows-1, j, rows, cols)
}
if board[0][j] == 'O'{ // O->*
solveDFS(&board, 0, j, rows, cols)
}
}
// O -> X
for i:=0; i<rows; i++{
for j:=0; j<cols; j++{
if board[i][j] == 'O'{ //按行按列找到起始O的位置
board[i][j] = 'X'
}
}
}
// *->O
for i:=0; i<rows; i++{
for j:=0; j<cols; j++{
if board[i][j] == '*'{ //按行按列找到起始O的位置
board[i][j] = 'O'
}
}
}
}
var dx = []int{ 1, -1, 0, 0}
var dy = []int{ 0, 0, 1, -1}
func solveDFS(board *[][]byte, r,c,rows,cols int){
(*board)[r][c] = '*'
for i:=0; i<4; i++ {
if 0<=r+dx[i] && r+dx[i]<=rows-1 && 0<=c+dy[i] && c+dy[i]<=cols-1 && //不越界
(*board)[r+dx[i]][c+dy[i]] == 'O' {
solveDFS(board, r+dx[i], c+dy[i], rows, cols)
}
}
}