200.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package main
  2. // Grid coordinate of single grid
  3. type Grid struct {
  4. X int
  5. Y int
  6. }
  7. // UF state of union-find algorithm
  8. type UF struct {
  9. ID map[Grid]Grid
  10. Size map[Grid]int
  11. Cnt int
  12. }
  13. // Union ...
  14. func (uf *UF) Union(x1, y1, x2, y2 int) {
  15. g1 := uf.Find(x1, y1)
  16. g2 := uf.Find(x2, y2)
  17. if g1 == g2 {
  18. return
  19. }
  20. if uf.Size[g1] < uf.Size[g2] {
  21. uf.ID[g1] = g2
  22. uf.Size[g2] += uf.Size[g1]
  23. } else {
  24. uf.ID[g2] = g1
  25. uf.Size[g1] += uf.Size[g2]
  26. }
  27. uf.Cnt--
  28. }
  29. // Find ...
  30. func (uf *UF) Find(x, y int) Grid {
  31. g := Grid{x, y}
  32. for g != uf.ID[g] {
  33. g = uf.ID[g]
  34. }
  35. return g
  36. }
  37. // Connected ...
  38. func (uf *UF) Connected(x1, y1, x2, y2 int) bool {
  39. return uf.Find(x1, y1) == uf.Find(x2, y2)
  40. }
  41. func numIslands(grid [][]byte) int { // Union-find algorithm
  42. hei := len(grid)
  43. if hei == 0 {
  44. return 0
  45. }
  46. wid := len(grid[0])
  47. var uf UF
  48. uf.ID = make(map[Grid]Grid)
  49. uf.Size = make(map[Grid]int)
  50. for y := 0; y < hei; y++ {
  51. for x := 0; x < wid; x++ {
  52. if grid[y][x] == '1' {
  53. g := Grid{x, y}
  54. uf.ID[g] = g
  55. uf.Size[g] = 1
  56. uf.Cnt++
  57. }
  58. }
  59. }
  60. for y := 0; y < hei; y++ {
  61. for x := 0; x < wid; x++ {
  62. if grid[y][x] == '0' {
  63. continue
  64. }
  65. if x+1 < wid && grid[y][x+1] == '1' {
  66. uf.Union(x, y, x+1, y)
  67. }
  68. if y+1 < hei && grid[y+1][x] == '1' {
  69. uf.Union(x, y, x, y+1)
  70. }
  71. }
  72. }
  73. return uf.Cnt
  74. }
  75. func main() {
  76. println(numIslands([][]byte{
  77. {'1', '1', '0', '0', '0'},
  78. {'1', '1', '0', '0', '0'},
  79. {'0', '0', '1', '0', '0'},
  80. {'0', '0', '0', '1', '1'}}))
  81. }