概述
给出两个整数m和n,代表一个m*n的网格。除此以外,还给出了两个二维整数的数组
-
guards,其中guards[i] = [rowi , columni]。它表示第i个守卫的位置
-
墙,其中guards[j] = [rowi , columni]。它代表第i个墙的位置
一个警卫可以看到所有的方向
-
北边
-
南边
-
东
-
西
除非有墙的阻挡。所有守卫能看到的牢房都算作有守卫。我们的目标是找到无人看守的牢房数量。
程序
以下是相同的程序
package main
import "fmt"
func countUnguarded(m int, n int, guards [][]int, walls [][]int) int {
occupancy := make([][]int, m)
for i := 0; i < m; i++ {
occupancy[i] = make([]int, n)
}
for _, val := range guards {
i := val[0]
j := val[1]
occupancy[i][j] = 2
}
for _, val := range walls {
i := val[0]
j := val[1]
occupancy[i][j] = -1
}
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if occupancy[i][j] == 2 {
countUtil(i, j, m, n, &occupancy)
}
}
}
count := 0
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if occupancy[i][j] == 0 {
count += 1
}
}
}
return count
}
func countUtil(x, y, m, n int, occupancy *([][]int)) {
for i := x + 1; i < m; i++ {
if (*occupancy)[i][y] == 0 {
(*occupancy)[i][y] = 1
}
if (*occupancy)[i][y] == -1 || (*occupancy)[i][y] == 2 {
break
}
}
for i := x - 1; i >= 0; i-- {
if (*occupancy)[i][y] == 0 {
(*occupancy)[i][y] = 1
}
if (*occupancy)[i][y] == -1 || (*occupancy)[i][y] == 2 {
break
}
}
for i := y + 1; i < n; i++ {
if (*occupancy)[x][i] == 0 {
(*occupancy)[x][i] = 1
}
if (*occupancy)[x][i] == -1 || (*occupancy)[x][i] == 2 {
break
}
}
for i := y - 1; i >= 0; i-- {
if (*occupancy)[x][i] == 0 {
(*occupancy)[x][i] = 1
}
if (*occupancy)[x][i] == -1 || (*occupancy)[x][i] == 2 {
break
}
}
}
func main() {
output := countUnguarded(4, 6, [][]int{{0, 0}, {1, 1}, {2, 3}}, [][]int{{0, 1}, {2, 2}, {1, 4}})
fmt.Println(output)
output = countUnguarded(3, 3, [][]int{{1, 1}}, [][]int{{0, 1}, {1, 0}, {2, 1}, {1, 2}})
fmt.Println(output)
}
输出
7
4
注意: 请查看我们的Golang高级教程。这个系列的教程是精心设计的,我们试图用例子涵盖所有的概念。本教程是为那些希望获得专业知识和扎实了解Golang的人准备的 -Golang高级教程