2022.6.20今天你刷题了吗?
题目:
给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。
网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长
分析:
这道题的意思是说,这些黄色的边有多少个,把数量求出来,因此我们的思路是:
暴力求解,确定一个格子,判断它与水域和边界是否连接,如果满足该情况,就加1,一直遍历所有格子。这里要注意的是边界问题,因此我们把边界分为
4个边界:格子最外层,如果是1,则必有一条边
4个边界分别是for的起始和结尾
对于分边界,我们分为四个部分,也就是该格子的上下左右。
解析:
1.暴力求解
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
int res = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
int cont = 0;
if (grid[i][j])
{
if (i == 0 || grid[i - 1][j] == 0)
{
cont++;
}
if (j == 0 || grid[i][j - 1] == 0)
{
cont++;
}
if (i == n-1 || grid[i + 1][j] == 0)
{
cont++;
}
if (j == m-1 || grid[i][j + 1] == 0)
{
cont++;
}
}
res += cont;
}
}
return res;
}
};
2.DFS算法
该算法用于网格搜索,思想在于每次判断网格的上下左右,以及对边界额外处理。其中本题最主要的是:周长+1判断是岛屿到水域或者边界时
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
for (int r = 0; r < grid.size(); r++) {
for (int c = 0; c < grid[0].size(); c++) {
if (grid[r][c] == 1) {
// 题目限制只有一个岛屿,计算一个即可
return dfs(grid, r, c);
}
}
}
return 0;
}
int dfs(vector<vector<int>>& grid, int r, int c) {
if (!(0 <= r && r < grid.size() && 0 <= c && c < grid[0].size())) {
return 1;
}
if (grid[r][c] == 0) {
return 1;
}
if (grid[r][c] != 1) {
return 0;
}
grid[r][c] = 2;
//从一个岛屿方格走向一个非岛屿方格,就将周长加 1
return dfs(grid, r - 1, c)+ dfs(grid, r + 1, c)+ dfs(grid, r, c - 1)+ dfs(grid, r, c + 1);
}
};