DFS
class Solution {
public:
void dfs(vector<vector<char>>& grid, int i, int j) {
if(i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] == '0')return;
grid[i][j] = '0'; // miss
dfs(grid, i+1, j);
dfs(grid, i-1, j);
dfs(grid, i, j+1);
dfs(grid, i, j-1);
}
int numIslands(vector<vector<char>>& grid) {
int ans = 0;
for(int i = 0; i < grid.size(); i++){
for(int j = 0; j < grid[0].size(); j++){
if(grid[i][j] == '1'){
dfs(grid, i, j);
ans++;
}
}
}
return ans;
}
};
BFS
- 遍历整个数组,如果当前节点为‘1’,则岛屿数量加一,进行广度优先遍历,遍历过的节点置零,表示已访问过;
- 当前节点坐标入队,取当前节点坐标,节点坐标出队
- 若当前节点四周是否为‘1’ 且未到达边界,则将当前位置置零,当前坐标入队
- 重复上述操作,直至队空,本次遍历结束,寻找下一个为‘1’的节点。
class Solution {
public:
struct node{
int x,y;
};
void bfs(vector<vector<char>>& grid,int x,int y){
queue<node> que;
int row=grid.size();
int col=grid[0].size();
que.push((node){x, y});//存入开始坐标
//char t = grid[x][y];
grid[x][y] = '0';//标记此点的值
while(!que.empty()){
node temp = que.front();//取出队列中的坐标
que.pop();//清空队列
int xx=temp.x;
int yy=temp.y;
if (xx-1 >= 0 && grid[xx-1][yy] == '1'){//左
que.push({xx-1, yy});
grid[xx-1][yy] = '0'; //置零,表示已经探测过
}
if (xx+1 < row && grid[xx+1][yy] == '1'){//右
que.push({xx+1, yy});
grid[xx+1][yy] = '0'; //置零,表示已经探测过
}
if (yy-1 >= 0 && grid[xx][yy-1] == '1'){//下
que.push({xx, yy-1});
grid[xx][yy-1] = '0'; //置零,表示已经探测过
}
if (yy+1 < col && grid[xx][yy+1] == '1'){//上
que.push({xx, yy+1});
grid[xx][yy+1] = '0'; //置零,表示已经探测过
}
}
}
int numIslands(vector<vector<char>>& grid) {
int row=grid.size();if (!row) return 0;
int col=grid[0].size();
int ret=0;
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
if(grid[i][j] == '1') //遇到1,遍历
{
ret++;
bfs(grid,i,j);
}
}
}
return ret;
}
};