130.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func solve(board [][]byte) {
  6. height := len(board)
  7. if height == 0 {
  8. return
  9. }
  10. width := len(board[0])
  11. type Grid struct {
  12. X int
  13. Y int
  14. }
  15. flipMap := make(map[Grid]bool, 0)
  16. stack := make([]Grid, 0)
  17. for y := 0; y < height; y++ {
  18. for x := 0; x < width; x++ {
  19. if (x == 0 || x == width-1 || y == 0 || y == height-1) &&
  20. board[y][x] == 'O' {
  21. flipMap[Grid{x, y}] = true
  22. stack = append(stack, Grid{x, y})
  23. }
  24. }
  25. }
  26. for len(stack) != 0 {
  27. length := len(stack)
  28. grid := stack[length-1] // Pop top grid
  29. stack = stack[:length-1]
  30. if grid.X > 0 &&
  31. !flipMap[Grid{grid.X - 1, grid.Y}] && // If left grid's not visited
  32. board[grid.Y][grid.X-1] == 'O' {
  33. flipMap[Grid{grid.X - 1, grid.Y}] = true
  34. stack = append(stack, Grid{grid.X - 1, grid.Y})
  35. }
  36. if grid.X < width-1 &&
  37. !flipMap[Grid{grid.X + 1, grid.Y}] && // ...Right grid
  38. board[grid.Y][grid.X+1] == 'O' {
  39. flipMap[Grid{grid.X + 1, grid.Y}] = true
  40. stack = append(stack, Grid{grid.X + 1, grid.Y})
  41. }
  42. if grid.Y > 0 &&
  43. !flipMap[Grid{grid.X, grid.Y - 1}] && // ...Up
  44. board[grid.Y-1][grid.X] == 'O' {
  45. flipMap[Grid{grid.X, grid.Y - 1}] = true
  46. stack = append(stack, Grid{grid.X, grid.Y - 1})
  47. }
  48. if grid.Y < height-1 &&
  49. !flipMap[Grid{grid.X, grid.Y + 1}] && //...Down
  50. board[grid.Y+1][grid.X] == 'O' {
  51. flipMap[Grid{grid.X, grid.Y + 1}] = true
  52. stack = append(stack, Grid{grid.X, grid.Y + 1})
  53. }
  54. }
  55. for y := 0; y < height; y++ {
  56. for x := 0; x < width; x++ {
  57. if !flipMap[Grid{x, y}] && board[y][x] == 'O' {
  58. board[y][x] = 'X'
  59. }
  60. }
  61. }
  62. }
  63. func printBoard(board [][]byte) {
  64. for _, row := range board {
  65. for _, val := range row {
  66. fmt.Printf("%c ", val)
  67. }
  68. println()
  69. }
  70. }
  71. // func main() {
  72. // b1 := [][]byte{
  73. // {'X', 'X', 'X', 'X'},
  74. // {'X', 'O', 'X', 'X'},
  75. // {'X', 'X', 'O', 'X'},
  76. // {'X', 'X', 'O', 'X'}}
  77. // solve(b1)
  78. // printBoard(b1)
  79. // }