| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package A
- type node1559 struct {
- x, y int
- px, py int
- }
- func containsCycle(grid [][]byte) bool {
- m := len(grid)
- n := len(grid[0])
- if m < 2 || n < 2 {
- return false
- }
- visited := make([][]bool, m)
- for i := range visited {
- visited[i] = make([]bool, n)
- }
- dirs := [][2]int{{0, -1}, {0, 1}, {-1, 0}, {1, 0}}
- for i := 0; i < m; i++ {
- for j := 0; j < n; j++ {
- if visited[i][j] {
- continue
- }
- visited[i][j] = true
- stack := []node1559{{x: i, y: j, px: -1, py: -1}}
- for len(stack) > 0 {
- top := stack[len(stack)-1]
- stack = stack[:len(stack)-1]
- for _, dir := range dirs {
- nx := top.x + dir[0]
- ny := top.y + dir[1]
- if nx < 0 || nx >= m || ny < 0 || ny >= n {
- continue
- }
- if grid[nx][ny] != grid[top.x][top.y] {
- continue
- }
- if !visited[nx][ny] {
- visited[nx][ny] = true
- stack = append(stack, node1559{x: nx, y: ny, px: top.x, py: top.y})
- } else if nx != top.px || ny != top.py {
- return true
- }
- }
- }
- }
- }
- return false
- }
|