intnumIslands(vector<vector<char>>& grid){ int m = grid.size(); if (m == 0) return0; // 处理空网格 int n = grid[0].size(); int sum = 0; // (步骤说明):遍历网格中的每一个单元格 for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { // 如果找到一块陆地 ('1') if (grid[i][j] == '1') { sum++; // 我们发现了一个新岛屿,计数器加 1 // (步骤说明):调用 DFS 将这个岛屿上的所有 '1' // 全部“淹没” (改成 '0'),这样它们就不会被重复计算 dfs(grid, i, j); } } } return sum; } // 辅助函数:深度优先搜索 (DFS), 用于“淹没”与 (r, c) 相连的所有陆地 voiddfs(vector<vector<char>>& grid, int r, int c){ int m = grid.size(); int n = grid[0].size();
// (步骤说明):Base Case 1: 检查是否越界 if (r < 0 || r >= m || c < 0 || c >= n) { return; }
// (步骤说明):Base Case 2: 检查是否为水或已访问 (已沉没) if (grid[r][c] != '1') { return; }
boolcanFinish(int numCourses, vector<vector<int>>& prerequisites){ // 1. 初始化邻接表和入度数组 // 邻接表 adj[bi] 存储所有以 bi 为先修课的课程 ai vector<vector<int>> adj(numCourses); // 在我之后学的课程 // indegree[ai] 存储课程 ai 有多少门先修课 vector<int> indegree(numCourses, 0); // 在我之前必须学的课程数
// 遍历所有先修关系, 从所给的条件中构建邻接表和入度数组 for (constauto& pre : prerequisites) { int course = pre[0]; // 课程 ai int prereq = pre[1]; // 课程 bi // 建立一条从 bi 到 ai 的边 adj[prereq].push_back(course); // 课程 ai 的入度(先修课数量)加 1 indegree[course]++; }
// 2. 初始化队列,将所有入度为 0 的节点(课程)入队 queue<int> q; for (int i = 0; i < numCourses; ++i) { if (indegree[i] == 0) { q.push(i); } }
int count = 0; // 记录已修完的课程数量
// 3. 执行 BFS while (!q.empty()) { // 从队列中取出一门课,代表我们“修完了”这门课 int course = q.front(); q.pop(); count++; // 修完的课程数 +1