
迭代模拟
- type一个pair类型,x,y
- 新建一个pair类型的数组,表示四个方向,上移,下移,左移,右移
- 遍历grid,当值为1时,判断其四个方向是否满足边界或值为0,满足则ans++
- 判断四个方向则通过遍历dir4这个数组,让i,j与数组内的值相加得到四个方向的坐标
type pair struct{ x, y int }
var dir4 = []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
func islandPerimeter(grid [][]int) (ans int) {
n, m := len(grid), len(grid[0])
for i, row := range grid {
for j, v := range row {
if v == 1 {
for _, d := range dir4 {
if x, y := i+d.x, j+d.y; x < 0 || x >= n || y < 0 || y >= m || grid[x][y] == 0 {
ans++
}
}
}
}
}
return
}
DFS
- 迭代模拟算层序遍历吧,,,
- dfs找到第一个陆地
- 然后dfs第一个陆地
- 防止重复遍历陆地,将遍历过的陆地标记为2
- 如果当前陆地未被标记则dfs当前陆地
- 如果某个方向满足条件,则ans++,并且直接return,因为满足条件则表示dfs的最深处
type pair struct{ x, y int }
var dir4 = []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
func islandPerimeter(grid [][]int) (ans int) {
n, m := len(grid), len(grid[0])
var dfs func(x, y int)
dfs = func(x, y int) {
if x < 0 || x >= n || y < 0 || y >= m || grid[x][y] == 0 {
ans++
return
}
if grid[x][y] == 2 {
return
}
grid[x][y] = 2
for _, d := range dir4 {
dfs(x+d.x, y+d.y)
}
}
for i, row := range grid {
for j, v := range row {
if v == 1 {
dfs(i, j)
return
}
}
}
return
}