| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | package main// Grid coordinate of single gridtype Grid struct {	X int	Y int}// UF state of union-find algorithmtype UF struct {	ID   map[Grid]Grid	Size map[Grid]int	Cnt  int}// Union ...func (uf *UF) Union(x1, y1, x2, y2 int) {	g1 := uf.Find(x1, y1)	g2 := uf.Find(x2, y2)	if g1 == g2 {		return	}	if uf.Size[g1] < uf.Size[g2] {		uf.ID[g1] = g2		uf.Size[g2] += uf.Size[g1]	} else {		uf.ID[g2] = g1		uf.Size[g1] += uf.Size[g2]	}	uf.Cnt--}// Find ...func (uf *UF) Find(x, y int) Grid {	g := Grid{x, y}	for g != uf.ID[g] {		g = uf.ID[g]	}	return g}// Connected ...func (uf *UF) Connected(x1, y1, x2, y2 int) bool {	return uf.Find(x1, y1) == uf.Find(x2, y2)}func numIslands(grid [][]byte) int { // Union-find algorithm	hei := len(grid)	if hei == 0 {		return 0	}	wid := len(grid[0])	var uf UF	uf.ID = make(map[Grid]Grid)	uf.Size = make(map[Grid]int)	for y := 0; y < hei; y++ {		for x := 0; x < wid; x++ {			if grid[y][x] == '1' {				g := Grid{x, y}				uf.ID[g] = g				uf.Size[g] = 1				uf.Cnt++			}		}	}	for y := 0; y < hei; y++ {		for x := 0; x < wid; x++ {			if grid[y][x] == '0' {				continue			}			if x+1 < wid && grid[y][x+1] == '1' {				uf.Union(x, y, x+1, y)			}			if y+1 < hei && grid[y+1][x] == '1' {				uf.Union(x, y, x, y+1)			}		}	}	return uf.Cnt}func main() {	println(numIslands([][]byte{		{'1', '1', '0', '0', '0'},		{'1', '1', '0', '0', '0'},		{'0', '0', '1', '0', '0'},		{'0', '0', '0', '1', '1'}}))}
 |