给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例1:
输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1
示例2:
输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3
方法一:广度优先遍历
代码
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int Xi[4]={0, 1, 0, -1};
int Yi[4]={1, 0, -1, 0};
int height = grid.size();
if(height==0) return 0;
int width = grid[0].size();
int ans = 0;
queue<pair<int,int>> q;
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
if(grid[i][j]=='1'){
grid[i][j]='0';
ans+=1;
q.emplace(i,j);
while(!q.empty()){
int x = q.front().first;
int y = q.front().second;
for(int t=0;t<4;t++){
int xi = x+Xi[t];
int yi = y+Yi[t];
if(xi>=0&&xi<height&&yi>=0&&yi<width&&grid[xi][yi]=='1'){
q.emplace(xi,yi);
grid[xi][yi] = '0';
}
}
q.pop();
}
}
}
}
return ans;
}
};
方法二:深度优先遍历(暂时一知半解勉强可以做出来,理解还不透彻,解析待补充)
代码
在这里插入代码片class Solution {
public:
void dfs(vector<vector<char>>& grid,int x,int y){
int height = grid.size();
int width = grid[0].size();
grid[x][y] = '0';
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,-1,1};
for(int i=0;i<4;i++){
int xi = x+dx[i],yi = y+dy[i];
if(xi>=0&&xi<height&&yi>=0&&yi<width&&grid[xi][yi]=='1'){
dfs(grid,xi,yi);
}
}
}
int numIslands(vector<vector<char>>& grid) {
int height = grid.size();
if(height==0) return 0;
int width = grid[0].size();
int ans = 0;
for(int i=0;i<width;i++){
for(int j=0;j<height;j++){
if(grid[j][i]=='1'){
ans+=1;
dfs(grid,j,i);
}
}
}
return ans;
}
};
输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3
方法一:广度优先遍历
代码
class Solution {
public:
int findCircleNum(vector<vector<int>>& isConnected) {
int nums = isConnected.size();
int ans = 0;
int flag[nums];
memset(flag,0,sizeof(flag));
queue<int> q;
for(int i=0;i<nums;i++){
if(flag[i]==0){
ans+=1;
flag[i]=1;
q.push(i);
while(!q.empty()){
int j = q.front();
q.pop();
for(int t=0;t<nums;t++){
if(isConnected[j][t]==1&&flag[t]==0){
q.push(t);
flag[t]=1;
}
}
}
}
}
return ans;
}
};
方法二:深度优先遍历(暂时一知半解勉强可以做出来,理解还不透彻,解析待补充)
代码
class Solution {
public:
int flag[201]={0};//全局数组,可以这样赋初值为0,局部数组则需要memset函数
void dfs(vector<vector<int>>& isConnected,int i){
int nums = isConnected.size();
for(int t=0;t<nums;t++){
if(flag[t]==0&&isConnected[i][t]==1){
flag[t]=1;
dfs(isConnected,t);
}
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
int nums = isConnected.size();
if(nums==0) return 0;
int ans = 0;
for(int i=0;i<nums;i++){
if(flag[i]==0){
flag[i] = 1;
ans+=1;
dfs(isConnected,i);
}
}
return ans;
}
};