func (g *grid) traverseBasinSize(column, row int, visited map[int]bool) int {
	if visited[g.rowColIndex(column, row)] || g.valAt(column, row) == 9 {
		return 0
	}
	visited[g.rowColIndex(column, row)] = true
	basinSize := 1 // self
	basinSize += g.traverseBasinSize(column+1, row, visited)
	basinSize += g.traverseBasinSize(column, row+1, visited)
	basinSize += g.traverseBasinSize(column-1, row, visited)
	basinSize += g.traverseBasinSize(column, row-1, visited)
	return basinSize
}
// traverse each spot around, if 9, stop
traverse each spot around, if 9, stop
// traverse each spot around if 9 stop
func (g *grid) traverseBasinSize(column, row int, visited map[int]bool) int {
	if visited[g.rowColIndex(column, row)] || g.valAt(column, row) == 9 {
		return 0
	}
	visited[g.rowColIndex(column, row)] = true
	basinSize := 1 
	basinSize += g.traverseBasinSize(column+1, row, visited)
	basinSize += g.traverseBasinSize(column, row+1, visited)
	basinSize += g.traverseBasinSize(column-1, row, visited)
	basinSize += g.traverseBasinSize(column, row-1, visited)
	return basinSize
}
func ( g * grid ) traverseBasinSize ( column , row int , visited map [ int ] bool ) int { if visited [ g . rowColIndex ( column , row ) ] || g . valAt ( column , row ) == 9 { return 0 } visited [ g . rowColIndex ( column , row ) ] = true basinSize := 1 basinSize += g . traverseBasinSize ( column + 1 , row , visited ) basinSize += g . traverseBasinSize ( column , row + 1 , visited ) basinSize += g . traverseBasinSize ( column - 1 , row , visited ) basinSize += g . traverseBasinSize ( column , row - 1 , visited ) return basinSize }
traverse each spot around, if 9, stop
traverse each spot around if 9 stop
// self