难度中等392收藏分享切换为英文关注反馈
给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入: 11110 11010 11000 00000 输出: 1
示例 2:
输入: 11000 11000 00100 00011 输出: 3
思路:写个bfs模板吧,好长好垃圾的代码..
class Solution {
bool inq[501][501] = {false};
struct Node{int x,y;};
//方向
int X[4] = {0,0,-1,1};
int Y[4] = {-1,1,0,0};
public:
//判断出界,访问过,碰到‘0’
bool judge(vector<vector<char>>& g,int x,int y,int n,int m){
if(x<0||x>=n||y<0||y>=m||inq[x][y]==true)return false;
if(g[x][y]=='0')return false;
return true;
}
//bfs模板
void bfs(int x,int y,int n,int m,vector<vector<char>>& g){
queue<Node> q;
Node s;
s.x = x;
s.y = y;
q.push(s);
inq[x][y] = true;
while(!q.empty()){
Node now = q.front();
q.pop();
for(int i = 0;i<4;i++){
int newx = now.x + X[i];
int newy = now.y + Y[i];
if(judge(g,newx,newy,n,m)){
Node newnode;
newnode.x = newx;
newnode.y = newy;
q.push(newnode);
inq[newx][newy] = true;
}
}
}
}
int numIslands(vector<vector<char>>& grid) {
if(grid.empty())return 0;
int n = grid.size(); //行
int m = grid[0].size(); //列
int cnt = 0;
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
if(grid[i][j]=='1'&&inq[i][j]==false){
bfs(i,j,n,m,grid);
cnt++;
}
}
}
return cnt;
}
};