题目(来源于leetcode):
思路。每次找出与一个陆地相邻的所有陆地。知道一个队列出现空,ans+1。
代码:
class Solution {
public:
vector<vector<char>> grid;
queue<pair<int,int>>que;
//判断是否为合法陆地
bool isIsland(int x,int y){
return 0<=x && x<grid.size()
&& 0<=y && y<grid[0].size()//在边界内
&& grid[x][y]=='1';//值为1
}
//将陆地旁边的陆地放入探索队列(上下左右四个方向)
void checkAndEnqueue(int x,int y){
if(isIsland(x-1,y)) que.push(make_pair(x-1,y));
if(isIsland(x+1,y)) que.push(make_pair(x+1,y));
if(isIsland(x,y-1)) que.push(make_pair(x,y-1));
if(isIsland(x,y+1)) que.push(make_pair(x,y+1));
}
int numIslands(vector<vector<char>>& grid) {
this->grid=grid;
if(grid.empty()) return 0;
int m=grid.size(),n=grid[0].size(),ans=0;//给定地图的长宽
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
//第一次碰到陆地
if(grid[i][j]=='1'){
que.push(make_pair(i,j));//将此点入队列
ans++;
//探索此岛屿所有相连的陆地
while(!que.empty()){
pair<int,int> root=que.front();
que.pop();//队列首出队
int x=root.first,y=root.second;
if(grid[x][y]=='0')continue;//为零直接出队
//标记为已探索
grid[x][y]='0';
//将相连的陆地放入探险队列
checkAndEnqueue(x,y);
}
}
}
}
return ans;
}
};