当前位置: 首页 > news >正文

洛谷 P1506:拯救oibh总部 ← Flood fill + 边界扩展

【题目来源】
https://www.luogu.com.cn/problem/P1506

【题目描述】
oibh 被突来的洪水淹没了,还好 oibh 总部有在某些重要的地方起一些围墙。用 * 号表示,而一个四面被围墙围住的区域洪水是进不去的。
oibh 总部内部也有许多重要区域,每个重要区域在图中用一个 0 表示。
现在给出 oibh 的围墙建设图,问有多少个没被洪水淹到的重要区域。

【输入格式】
第一行为两个正整数 x,y。
接下来 x 行,每行 y 个字符,由 * 和 0 组成,表示 oibh 总部的建设图。

【输出格式】
输出没被水淹没的 oibh 总部的 0 的数量。

【输入样例一】
4 5
00000
00*00
0*0*0
00*00

【输出样例一】
1

【输入样例二】
5 5
*****
*0*0*
**0**
*0*0*
*****

【输出样例二】
5

【数据范围】
对于100%的数据,1≤x,y≤500。

【算法分析】
● 本题与“信息学奥赛一本通1359:围成面积”的算法思想一致,都是“扩展边界”,详见:
https://blog.csdn.net/hnjzsyjyj/article/details/158660302
● 扩展边界思想
(1)扩展边界不是 “可有可无” 的技巧,而是将 “多起点 BFS” 转化为 “单起点 BFS” 的通用方法。
(2)扩展边界的本质是用 “空间换逻辑简化”。
(3)扩展边界的真正价值,是应对原始边界 0 被 1 分割成多个不连通区域的通用场景 —— 通过虚拟边界的 “全 0 连通性”,把 “遍历所有物理边界点” 的复杂操作,简化为 “从虚拟起点 (0,0) 一次 BFS”,这是解决 “边界连通性” 问题的经典技巧。
● cin 会读入二维 char 数组每行后的换行符吗?
默认情况下,cin 读取 char 类型时,会自动跳过换行符、空格等空白字符,不会把它们存入 char 数组。

【算法代码一:dfs + char 数组
全局二维 char 数组未显示初始化时,其元素的值是随机 ASCII 字符(不是 '0'),所以需要利用命令 memset(mp,'0',sizeof mp); 显示初始化。

#include<bits/stdc++.h>
using namespace std;const int N=505;
char mp[N][N];
int dx[]= {1,0,-1,0};
int dy[]= {0,1,0,-1};
int n,m,ans;void dfs(int x,int y) {mp[x][y]='*';for(int i=0; i<4; i++) {int tx=x+dx[i];int ty=y+dy[i];if(tx>=0 && tx<=n+1 && ty>=0 && ty<=m+1 && mp[tx][ty]=='0') {dfs(tx,ty);}}
}int main() {memset(mp,'0',sizeof mp); //very importantcin>>n>>m;for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {cin>>mp[i][j];}}dfs(0,0);for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {if(mp[i][j]=='0') ans++;}}cout<<ans<<endl;return 0;
}/*
in:
5 5
*****
*0*0*
**0**
*0*0*
*****out:
5
*/

【算法代码二:bfs + pair + char 数组
全局二维 char 数组未显示初始化时,其元素的值是随机 ASCII 字符(不是 '0'),所以需要利用命令 memset(mp,'0',sizeof mp); 显示初始化。

#include<bits/stdc++.h>
using namespace std;typedef pair<int,int> PII;
const int N=505;
char mp[N][N];
int dx[]= {1,0,-1,0};
int dy[]= {0,1,0,-1};
int n,m,ans;void bfs(int x,int y) {queue<PII> q;mp[x][y]='*';q.push({x,y});while(!q.empty()) {PII t=q.front();q.pop();for(int i=0; i<4; i++) {int tx=t.first+dx[i];int ty=t.second+dy[i];if(tx>=0 && tx<=n+1 && ty>=0 && ty<=m+1 && mp[tx][ty]=='0') {mp[tx][ty]='*';q.push({tx,ty});}}}
}int main() {memset(mp,'0',sizeof mp); //very importantcin>>n>>m;for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {cin>>mp[i][j];}}bfs(0,0);for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {if(mp[i][j]=='0') ans++;}}cout<<ans<<endl;return 0;
}/*
in:
5 5
*****
*0*0*
**0**
*0*0*
*****out:
5
*/

【算法代码三:dfs + int 数组

#include<bits/stdc++.h>
using namespace std;const int N=505;
int mp[N][N];
int dx[]= {1,0,-1,0};
int dy[]= {0,1,0,-1};
int n,m,ans;
char ch;void dfs(int x,int y) {mp[x][y]=1;for(int i=0; i<4; i++) {int tx=x+dx[i];int ty=y+dy[i];if(tx>=0 && tx<=n+1 && ty>=0 && ty<=m+1 && mp[tx][ty]==0) {dfs(tx,ty);}}
}int main() {cin>>n>>m;for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {cin>>ch;if(ch=='*') mp[i][j]=1;else mp[i][j]=0;}}dfs(0,0);for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {if(mp[i][j]==0) ans++;}}cout<<ans<<endl;return 0;
}/*
in:
5 5
*****
*0*0*
**0**
*0*0*
*****out:
5
*/

【算法代码四:bfs + pair + int 数组

#include<bits/stdc++.h>
using namespace std;typedef pair<int,int> PII;
const int N=505;
int mp[N][N];
int dx[]= {1,0,-1,0};
int dy[]= {0,1,0,-1};
int n,m,ans;
char ch;void bfs(int x, int y) {queue<PII> q;mp[x][y]=1;q.push({x,y});while(!q.empty()) {PII t=q.front();q.pop();for(int i=0; i<4; i++) {int tx=t.first+dx[i];int ty=t.second+dy[i];if(tx>=0 && tx<=n+1 && ty>=0 && ty<=m+1 && mp[tx][ty]==0) {mp[tx][ty]=1;q.push({tx,ty});}}}
}int main() {cin>>n>>m;for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {cin>>ch;if(ch=='*') mp[i][j]=1;else mp[i][j]=0;}}bfs(0,0);for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {if(mp[i][j]==0) ans++;}}cout<<ans<<endl;return 0;
}/*
in:
5 5
*****
*0*0*
**0**
*0*0*
*****out:
5
*/




【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/158660302
https://blog.csdn.net/hnjzsyjyj/article/details/158656746
https://blog.csdn.net/hnjzsyjyj/article/details/158655296
https://blog.csdn.net/hnjzsyjyj/article/details/118642238
https://blog.csdn.net/hnjzsyjyj/article/details/158657970
https://blog.csdn.net/hnjzsyjyj/article/details/158618461

http://www.jsqmd.com/news/437974/

相关文章:

  • 深入浅出 SQLSugar:快速掌握高效 .NET ORM 框架
  • 除了OpenClaw大龙虾,还有6只“小龙虾“:什么是Nanobot:Py开发者,什么是NanoClaw:多智能体, 什么是IronClaw:安全,什么是ZeroClaw:树莓派,什么是PicoCla
  • 2026-03-05 GitHub 热点项目精选
  • 周口淮阳区轮胎品牌专业度评估:2026年3月靠谱推荐 - 2026年企业推荐榜
  • 仁王3的宏 和 浪人崛起
  • 2026年徐州聚氨酯保温保冷施工团队权威评测与选型指南 - 2026年企业推荐榜
  • 2026年2-甲基四氢呋喃供应商竞争力全景报告 - 2026年企业推荐榜
  • 艺术漆选购指南:2026年广东地区高口碑品牌综合解析 - 2026年企业推荐榜
  • 2026年3月北京优质路边石供应厂家综合盘点 - 2026年企业推荐榜
  • 2026年初旧房翻新改造实力公司综合评估与选择指南 - 2026年企业推荐榜
  • 帝王蟹封口机选型指南:2026年TOP5厂家综合评测与推荐 - 2026年企业推荐榜
  • 2026年初精选:压缩机清洗剂与除垢剂高评价供应商盘点 - 2026年企业推荐榜
  • 宜兴斜管填料厂家综合评测:2026年五大实力品牌推荐 - 2026年企业推荐榜
  • 2026年Q1石家庄系统窗生产厂家口碑深度解析与选型指南 - 2026年企业推荐榜
  • 2026年东莞AI咨询外包服务团队综合评测与选型指南 - 2026年企业推荐榜
  • 新手如何快速搭建一个Springboot项目
  • 2026年3月漯河郾城区旧房翻新团队综合实力解析 - 2026年企业推荐榜
  • RocketMQ顺序消息全解析
  • JavaScript核心语法精要指南
  • 2026年优质耐酸耐高压反渗透膜生产厂家推荐:杭州奈诺膜领衔, 专业高压反渗透膜厂家/高温反渗透膜厂家甄选指南 - 栗子测评
  • 2026年河南煤仓旋转防堵机优质厂家综合评测 - 2026年企业推荐榜
  • 《被讨厌的勇气》:你的痛苦,都是自己选的
  • 【易经系列】《需卦》九五:需于酒食,贞吉。
  • 2026年AI智能体企业评测:智图未来领跑,谁更靠谱? - 2026年企业推荐榜
  • 2026年03月04日最热门的开源项目(Github)
  • 2026-03-05 全国各地响应最快的 BT Tracker 服务器(移动版)
  • 《产品分析标准实践手册》:核心定义与关键概念拆解、产品分析方法、模板···(附相关材料下载)
  • 全网独家首发 | 全球畅销400w+册,扎克伯格陪孩子共读,这套科普启蒙终于出中文版了!
  • VBA实现当B列内容不为空时自动赋值K、L列
  • 2026年专业刹车油品牌厂商综合评估与选型指南 - 2026年企业推荐榜