原题
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:
11110
11010
11000
00000输出: 1
示例 2:
输入:
11000
11000
00100
00011输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands
解法
我估摸着扣哥还是放水了吧~
这怕是每个人入门 dfs 的题目了吧?
//可以寻找的方向,左右上下
int mvDistance[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
class Solution {
public:
int numIslands(vector<vector<char>> &grid) {
int res = 0;
int rows = grid.size(); // grid的行
if (rows == 0) {
return res;
}
int cols = grid[0].size(); // grid的列
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
// 从1开始找
if (grid[i][j] == '1') {
dfs(i, j, grid, rows, cols);
// 把所有的1都找完了,说明找到了一块连着的1,就要加1
++res;
}
}
}
return res;
}
void dfs(int x, int y, vector<vector<char>> &grid, int rows, int cols) {
// 这个1我已经用过了,以后我不能再用了。
grid[x][y] = '0';
for (int i = 0; i < 4; ++i) {
//左右上下移动
int mx = x + mvDistance[i][0], my = y + mvDistance[i][1];
//如果左右上下有满足条件的1,就从当前1作为起点开始找
if (0 <= mx && mx < rows && 0 <= my && my < cols && grid[mx][my] == '1') {
dfs(mx, my, grid, rows, cols);
}
}
}
};
总结
还是要多刷题,曾几何时,这种题我看都不敢看,虽然现在也还是很菜,但至少我敢看题目了。
诗情画意
蝶恋花 晏殊 槛菊愁烟兰泣露,罗慕轻寒,燕子双飞去。明月不谙离恨苦,斜光到晓穿朱户。 昨夜西风凋碧树,独上高楼,望尽天涯路。欲寄彩笺兼尺素,山长水阔知何处?