几天没写题了,手感生疏了不少,这题的话思路是DFS。首先将整个程序分成两个部分去理解,主程序的部分负责去循环遍历这个二维向量,我们使用一个dfs函数去处理每一个岛屿的统计。
这里我们主要来讨论一下这个dfs函数的功能,首先我们从题目中得知,只要一个为'1'
的点,其上下左右也存在为'1'
的点,则这些点视为一个岛屿,那我们就去循环这个地图,找到一个为'1'
的点,并对它的上下左右进行扫描,如果发现了为'1'
的点,则将这个点视为新的根节点,重复这个操作,直至找不到新的为'1'
的点,在这个过程中,注意将已经扫描到的为'1'
的点置为'0'
,防止多次扫描到同一个点,还有就是处理一个边界问题,总不能在执行上下左右扫描时超出整个地图。
思路有了,开始写代码,AC代码如下:
class Solution {
private:
void dfs(vector<vector<char>>& grid, int i, int j, int horizontal, int vertical) {
grid[i][j] = '0';
if(i-1 >= 0 && grid[i-1][j] == '1') {
dfs(grid, i-1, j, horizontal, vertical);
}
if(i+1 < horizontal && grid[i+1][j] == '1') {
dfs(grid, i+1, j, horizontal, vertical);
}
if(j-1 >= 0 && grid[i][j-1] == '1') {
dfs(grid, i, j-1, horizontal, vertical);
}
if(j+1 < vertical && grid[i][j+1] == '1') {
dfs(grid, i, j+1, horizontal, vertical);
}
}
public:
int numIslands(vector<vector<char>>& grid) {
int ans = 0;
int horizontal = grid.size();
int vertical = grid[0].size();
for(int i=0;i<horizontal;i++) {
for(int j=0;j<vertical;j++) {
if(grid[i][j] == '1') {
dfs(grid, i, j, horizontal, vertical);
ans++;
}
}
}
return ans;
}
};