classSolution { public: // 全局变量 vector<vector<char>> g; // 先定义4个方向 int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; int cnt = 0;// 记录连通块的个数
intnumIslands(vector<vector<char>>& grid){ g = grid;
for (int i = 0; i < g.size(); i ++) { for (int j = 0; j < g[i].size(); j ++) { // 找1的连通块 if (g[i][j] == '1') { dfs(i,j); // bfs({i, j}); cnt ++; // 上面每搜完一个连通块,就把cnt+1 } } } return cnt; }
// dfs代码 voiddfs(int x, int y) { // 遍历过的位置,变为0, 防止重复遍历 g[x][y] = '0'; // 向4个方向找1 for (int i = 0; i < 4; i ++) { // 计算 下一个位置的坐标(a,b) int a = x + dx[i], b = y + dy[i]; // 下一个位置(a,b)上也是1,就继续dfs if (a >= 0 && a < g.size() && b >= 0 && b < g[0].size() && g[a][b] == '1') dfs(a, b); } } };
classSolution { public: // 全局变量 vector<vector<char>> g; // 先定义4个方向 int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; int cnt = 0;// 记录连通块的个数
intnumIslands(vector<vector<char>>& grid){ g = grid;
for (int i = 0; i < g.size(); i ++) { for (int j = 0; j < g[i].size(); j ++) { // 找1的连通块 if (g[i][j] == '1') { // dfs(i,j); bfs({i, j}); cnt ++; // 上面每搜完一个连通块,就把cnt+1 } } } return cnt; }
voidbfs(PII p) { queue<PII> q; q.push(p);
while (!q.empty()) { PII t = q.front(); q.pop();
// 拓展4个方向 for (int i = 0; i < 4; i ++) { // 下一个位置的坐标(a,b) int a = t.first + dx[i], b = t.second + dy[i]; if (a < 0 || a >= g.size() || b < 0 || b >= g[0].size() || g[a][b] == '0') continue; g[a][b] = '0'; q.push({a,b}); } } } };