信息学奥赛一本通 1359 围成面积

📅 发布时间:2026/7/4 15:42:12 👁️ 浏览次数:
信息学奥赛一本通 1359 围成面积
信息学奥赛一本通 1359 围成面积信息学奥赛一本通 1359 围成面积和洛谷填涂颜色是同款思路核心就是用 DFS “反向找外围”。今天用最接地气的方式拆解这道题附上能直接 AC 的代码。题目核心给一个 10×10 的矩阵里面只有 0 和 11 是围墙要求统计被 1 完全包围的 0 的数量。简单说就是和矩阵边界相连的 0 不算只有被 1 圈在中间的 0 才要计数。为啥不直接找被包围的 0因为判断 “被包围” 太麻烦不如换个思路先把所有和边界相连的 “外围 0” 标记掉剩下的 0 就是被包围的最后数个数就行。上代码#include bits/stdc.h using namespace std; int a[15][15],dx[]{1,0,-1,0},dy[]{0,1,0,-1},ans; void dfs(int x,int y){ a[x][y]2; for(int i0;i4;i){ int txxdx[i],tyydy[i]; if(tx0tx11ty0ty11a[tx][ty]0)dfs(tx,ty); } } int main() { for(int i1;i10;i){ for(int j1;j10;j){ cina[i][j]; } } dfs(0,0); for(int i1;i10;i){ for(int j1;j10;j){ if(a[i][j]0)ans; } } coutans; return 0; }代码逻辑拆开来超易懂数组开 15×15 是为了给 10×10 的核心矩阵留一圈 “虚拟边界”0 行、0 列、11 行、11 列方便从 (0,0) 开始搜索dx、dy 数组是 DFS 的 “方向神器”对应上下左右四个方向新手记死这个组合就行DFS 函数从 (0,0) 出发把所有能走到的 0也就是和边界相连的外围 0改成 2—— 相当于给这些 0 贴 “排除标签”最后遍历 1~10 行、1~10 列的核心区域剩下没被改成 2 的 0就是被 1 包围的目标数个数就是答案。举个例子如果矩阵边缘有个 0DFS 会从 (0,0) 走到这个 0 并标成 2最后统计时不会算它而中间被 1 围起来的 0 没被标记会被计入 ans。踩坑提醒边界判断要写tx0tx11ty0ty11别只写到 10不然会漏掉外围边界DFS 里先把当前点改成 2 再搜四周防止重复遍历同一个 0。这道题的核心就是 “反向思维”与其找被包围的 0不如先排除不被包围的 0。掌握这个思路不管是统计封闭面积、填涂颜色还是类似的区域题都能直接套用。总结解题核心反向标记外围 0标为 2剩余未标记的 0 即为被包围的目标DFS 作用从 (0,0) 出发遍历并标记所有和边界相连的 0结果统计遍历 10×10 核心区域数剩余 0 的个数就是答案。