题解 | #岛屿数量#
岛屿数量
https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e
#include <utility> class Solution { public: int solve(vector<vector<char> >& grid) { set<pair<int, int>> recxy; // 用于记录被搜索到的坐标 int res = 0; for (int j = 0; j < grid.size(); j++) {// y for (int i = 0; i < grid[0].size(); i++) { // x if (!hasRec(recxy, i, j) && grid[j][i] == '1') { dfs(grid, i, j, recxy); res++; } } } return res; } void dfs(vector<vector<char> >& grid, int x, int y, set<pair<int, int>>& recxy) { //深度优先搜索 vector<pair<int, int>> xystack; pair<int, int> xy(x, y), tmp; xystack.push_back(xy); recxy.insert(xy); int xtmp, ytmp; while (!xystack.empty()) { xy = xystack.back(); xtmp = xy.first; ytmp = xy.second; if (valid(grid, xtmp - 1, ytmp) && !hasRec(recxy, xtmp - 1, ytmp) && grid[ytmp][xtmp - 1] == '1') { tmp.first = xtmp - 1; tmp.second = ytmp; xystack.push_back(tmp); recxy.insert(tmp); continue; } if (valid(grid, xtmp, ytmp - 1) && !hasRec(recxy, xtmp, ytmp - 1) && grid[ytmp - 1][xtmp] == '1') { tmp.first = xtmp; tmp.second = ytmp - 1; xystack.push_back(tmp); recxy.insert(tmp); continue; } if (valid(grid, xtmp + 1, ytmp) && !hasRec(recxy, xtmp + 1, ytmp) && grid[ytmp][xtmp + 1] == '1') { tmp.first = xtmp + 1; tmp.second = ytmp; xystack.push_back(tmp); recxy.insert(tmp); continue; } if (valid(grid, xtmp, ytmp + 1) && !hasRec(recxy, xtmp, ytmp + 1) && grid[ytmp + 1][xtmp] == '1') { tmp.first = xtmp; tmp.second = ytmp + 1; xystack.push_back(tmp); recxy.insert(tmp); continue; } xystack.pop_back(); } } bool hasRec(set<pair<int, int>>& recxy, int x, int y) { //判断是否被记录 pair<int, int> xy(x, y); return recxy.find(xy) != recxy.end(); } bool valid(vector<vector<char> >& grid, int x, int y) { //判断坐标是否超出矩阵尺寸 return x >= 0 && y >= 0 && x < grid[0].size() && y < grid.size(); } };