package main /* 先把边界为'0'的地方都BFS标记一次(会被淹没的'0') 然后再次BFS_未被标记的'0',计算安全的'0'的个数 */ import ( "fmt" ) type Node struct{ i,j int } func main() { var n,m int fmt.Scanf("%d %d",&n, &m) var k = make([][]byte, n) var v = make([][]bool, n) var s string for i:=0;i<n;i++{ k[i] = make([]byte, m) v[i] = make([]bool, m) fmt.Scanf("%s", &s) k[i] = []byte(s) } dist:= [][]int{{0,1}, {0,-1}, {1,0}, {-1,0}} var cur Node var queue []Node var result, ni, nj int var BFS func(i, j int) BFS = func(i, j int){ // 标记会被淹没的'0' queue = []Node{{i,j}} for len(queue) > 0{ cur = queue[0] queue = queue[1:] for _, d := range dist{ ni = cur.i + d[0] nj = cur.j + d[1] if ni<0 || ni>=n || nj<0 || nj>=m || v[ni][nj] || k[ni][nj] == '*'{ continue } v[ni][nj] = true queue = append(queue, Node{ni,nj}) } } } var BFS_ func(i, j int) // 累计安全的'0'的个数 BFS_ = func(i, j int){ queue = []Node{{i,j}} for len(queue) > 0{ cur = queue[0] queue = queue[1:] for _, d := range dist{ ni = cur.i + d[0] nj = cur.j + d[1] if ni<0 || ni>=n || nj<0 || nj>=m || v[ni][nj] || k[ni][nj] == '*'{ continue } v[ni][nj] = true result++ queue = append(queue, Node{ni,nj}) } } } // 标记会被淹没的区域 for i:=0;i<n;i++{ if k[i][0] == '0' && !v[i][0] { v[i][0] = true BFS(i,0) } if k[i][m-1] == '0' && !v[i][m-1]{ v[i][m-1] = true BFS(i,m-1) } } for i:=0;i<m;i++{ if k[0][i] == '0' && !v[0][i] { v[0][i] = true BFS(0,i) } if k[n-1][i] == '0' && !v[n-1][i]{ v[n-1][i] = true BFS(n-1,i) } } for i:=0;i<n;i++{ for j:=0;j<m;j++{ if k[i][j] == '0' && !v[i][j]{ v[i][j] = true result++ BFS_(i,j) } } } fmt.Print(result) }