题解 | 挡住洪水
挡住洪水
https://www.nowcoder.com/practice/56e54f4c2e3c4a58abfe76dbc1da1d7e
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
buf := bufio.NewReader(os.Stdin)
var n, m int
fmt.Fscan(buf, &n, &m)
sli := make([]string, n)
for i := 0; i < n; i++ {
fmt.Fscan(buf, &sli[i])
}
addx := [4]int{0, 0, 1, -1}
addy := [4]int{1, -1, 0, 0}
visited := make([][]bool, n)
for i := range visited {
visited[i] = make([]bool, m)
}
type p struct {
x, y int
}
total := 0
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if !visited[i][j] && sli[i][j] == '0' {
pos := []p{{i, j}}
visited[i][j] = true
count:=0
isSide := false
for len(pos) > 0 {
count++
c := pos[0]
pos = pos[1:]
if c.x == 0 || c.y == 0 || c.x == n-1 || c.y == m-1 {
isSide = true
}
for k := 0; k < 4; k++ {
nx, ny := c.x+addx[k], c.y+addy[k]
if nx >= 0 && ny >= 0 && nx < n && ny < m && !visited[nx][ny] && sli[nx][ny] == '0' {
visited[nx][ny] = true
pos = append(pos, p{nx, ny})
}
}
}
if !isSide{
total+=count
}
}
}
}
fmt.Print(total)
}
查看5道真题和解析