-
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
-
此外,你可以假设该网格的四条边均被水包围。
输入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3
- 遍历所有节点,如果为1进入dfs,将dfs能遍历到的“1”的位置设置为0,每次完成dfs之后岛屿数量加一。
- 本题和判断二分图有些类似,也可以使用涂色法,遍历一个设置值到0和1之外的值,然后遍历完将值设置为0。或者在入栈之后置为0即可
#include <stdio.h>
#include<vector>
#include<memory>
#include<iostream>
using namespace std;
class Solution{
public:
void dfs(int i,int j,vector<vector<char>>& gird){ //i,j为起始遍历的位置
gird[i][j] = '0';//当前位置置为'0'
//进行dfs的继续遍历,相当于入栈
if(i-1>=0){//上
if(gird[i-1][j]=='1'){
dfs(i-1,j,gird);
}
}
if(i+1<gird.size() ){//下
if(gird[i+1][j]=='1'){
dfs(i+1,j,gird);
}
}
if(j-1>=0 ){//左
if(gird[i][j-1]=='1'){
dfs(i,j-1,gird);
}
}
if(j+1<gird[0].size()){//右
if(gird[i][j+1]=='1'){
dfs(i,j+1,gird);
}
}
}
int numIslands(vector<vector<char>>& gird){
int unmislands = 0;//岛屿的数量
for(int i=0;i<gird.size();i++){
for(int j=0;j<gird[0].size();j++){
cout<< "888888888888"<<endl;
if(gird[i][j] == '1'){//如果为1进行dfs
++unmislands;
cout<< "888888888888"<<endl;
dfs(i,j, gird);
}
}
}
cout<< "----->" <<unmislands;
return unmislands;
}
};
int main()
{
printf("---<");
unique_ptr<Solution> mysolo = unique_ptr<Solution>(new Solution());
vector<vector<char>> gird = {{'1','1','0','0','0'},{'1','1','0','0','0'},{'0','0','1','0','0'},{'0','0','0','1','1'}};
int res = mysolo->numIslands(gird);
cout<< res<< endl;
return 0;
}