1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| package main
import ( "fmt" )
func rowToString(row []byte) string { result := "" for _, b := range row { result += string(b) + " " } return result[:len(result)-1] }
func numIslands(grid [][]byte) int { if len(grid) == 0 || len(grid[0]) == 0 { return 0 } rows, cols := len(grid), len(grid[0]) landCount := 0
var dfs func(r, c int) dfs = func(r, c int) { if r < 0 || r >= rows || c < 0 || c >= cols || grid[r][c] == '0' { return }
grid[r][c] = '0' dir := [][]int{{-1,0}, {0,1}, {1,0}, {0,-1}} for i := 0; i < 4; i++ { new_x, new_y := r + dir[i][0], c + dir[i][1] dfs(new_x, new_y); } }
for r := 0; r < rows; r++ { for c := 0; c < cols; c++ { if grid[r][c] == '1' { landCount++ dfs(r, c) } } } return landCount }
func main() { testCases := []struct { grid [][]byte expected int }{ { grid: [][]byte{ {'1', '1', '1', '1', '0'}, {'1', '1', '0', '1', '0'}, {'1', '1', '0', '0', '0'}, {'0', '0', '0', '0', '0'}, }, expected: 1, }, { grid: [][]byte{ {'1', '1', '0', '0', '0'}, {'1', '1', '0', '0', '0'}, {'0', '0', '1', '0', '0'}, {'0', '0', '0', '1', '1'}, }, expected: 3, }, }
for i, tc := range testCases { fmt.Printf("Test Case %d,Input: grid = \n", i+1) for _, row := range tc.grid { fmt.Printf("%s\n", rowToString(row)) } result := numIslands(tc.grid)
if result == tc.expected { fmt.Printf("Test Case %d, Output: %d, PASS\n", i+1, result) } else { fmt.Printf("Test Case %d, Output: %d, FAIL (Expected: %d)\n", i+1, result, tc.expected) } } }
|