代码:
cpp
class Solution {
public:
int dx[4] = {0,1,-1,0},dy[4] = {1,0,0,-1};
vector<vector<char>> g;
int numIslands(vector<vector<char>>& grid) {
g = grid;
int cnt = 0;
for(int i = 0;i<g.size();i++){
for(int j = 0;j<g[i].size();j++){//g[i].size() rather than g[0].size()
if(g[i][j]=='1'){
dfs(i,j);
cnt++;
}
}
}
return cnt;
}
void dfs(int x,int y){//not int i,int y 否则会和内层for循环中的i冲突
g[x][y] = '0';
for(int i = 0;i<4;i++){
int a = x+dx[i],b = y+dy[i];
if(a>=0 && b>=0
&& a<g.size() && b<g[a].size() //not a<=g.size() && b<=g[i].size()
&& g[a][b]=='1')//g[i].size() rather than g[0].size()
dfs(a,b);
}
}
};
这是flood fill算法经典应用。但是写的时候还是漏洞百出。
遍历整个vector,遇到'0'跳过,遇到'1'则深入下去直接把包括这个'1'在内的往四个方向扩展的岛屿全部遍历完,并标记为'0'。这一趟下去表明发现了一个岛屿,我们在dfs之后cnt++。
在dfs中,我们先将当前位置标记,然后计算四个方向的坐标,坐标如果合法,我们便深入遍历,在下一层dfs中,将那个坐标标记为'0'........