题目链接
这题颇有感触。
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:
[
[‘1’,‘1’,‘1’,‘1’,‘0’],
[‘1’,‘1’,‘0’,‘1’,‘0’],
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘0’,‘0’,‘0’,‘0’,‘0’]
]
输出: 1
示例 2:
输入:
[
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘0’,‘0’,‘1’,‘0’,‘0’],
[‘0’,‘0’,‘0’,‘1’,‘1’]
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
class Solution {
public:
void dfs(vector<vector<char>>& grid, vector<vector<int>>& vis, int x, int y,int rows,int cols, int &rest) {
//出口为rest==0
if (rest == 0) return;
// cout<<vis[x][y]<<endl;
if(grid[x][y]!='1'|| vis[x][y]==1) return;
//要标陆地记前则rest--
--rest;
//标记走过的陆地
vis[x][y] = 1;
//dfs从这个陆地寻路并标记
/*
4个方向走
*/
cout<<x<<"-"<<y<<"-";
cout<<rest<<endl;
if (x+1<rows && vis[x+1][y]!=1 && grid[x+1][y]=='1') {
dfs(grid, vis, x+1, y, rows, cols, rest);
}
if (y + 1 < cols && vis[x][y+1] != 1 && grid[x][y+1] == '1') {
dfs(grid, vis, x, y+1, rows, cols, rest);
}
if (x - 1 >=0 && vis[x - 1][y] != 1 && grid[x - 1][y] == '1') {
dfs(grid, vis, x-1, y, rows, cols, rest);
}
if (y - 1 >=0 && vis[x][y-1] != 1 && grid[x][y-1] == '1') {
dfs(grid, vis, x, y-1, rows, cols, rest);
}
return;
}
int numIslands(vector<vector<char>>& grid) {
int rest = 0,cnt=0;
int rows = grid.size();
if(rows==0){
return 0;
}
int cols = grid[0].size();
vector<vector<int>> vis(rows, vector<int>(cols));
//遍历一遍陆地数rest
for (int i = 0; i < rows;++i) {
for (int j = 0; j < cols;++j) {
if (grid[i][j] =='1') {
++rest;
}
}
}
//numIslands 遍历二维数组
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
if (rest == 0) break;
if (grid[i][j] == '1' && vis[i][j]!=1) {
//找到一个未标记陆地 cnt++;
++cnt;
dfs(grid,vis,i,j,rows,cols,rest);
}
}
if (rest == 0) break;
}
return cnt;
}
};