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

#题解//P1141/01迷宫

链接$ \to $P1141 01迷宫

吐槽

其实这题就是一道比较模板的BFS,只不过多了一个计数数组,一个记忆化,还有就是加了个状态~也不算难其实if里面多写点东西就是了~

核心逻辑解释

在这道题中,移动规则是:\(0 \to 1\)\(1 \to 0\)。如果你从点 \(A\) 出发能走到点 \(B\),那么根据规则,点 \(B\) 也一定能通过原路返回走到点 \(A\)。这意味着,所有能够互相到达的点组成了一个连通块(Connected Component)。在这个块里的任何一个点作为起点,它能遍历到的范围都是整个连通块。所以,当你用 BFS 跑完一次,数出了这个块里一共有 cnt 个格子时,这个块里所有的坐标对应的答案都应该是 cnt。这也就是那个BFS函数后面那个for循环的作用

具体的实现方法:

记忆化数组 mem:初始化为 -1。如果 bfs(x, y) 发现 mem[x][y] 不为 -1,说明这个点所在的连通块已经计算过了,直接返回答案。
连通块记录 visited:在 BFS 过程中,用一个容器(如 vector)记录下所有能走到的坐标。
结果同步:BFS 结束后,这个连通块里所有的点能到达的格子数都是一样的。所以我们遍历 visited,把所有这些坐标在 mem 里的值都设为 cnt。
访问标记 vis:配合 pos 变量使用。每次开启新的 BFS,pos++。若 vis[i][j] != pos,则表示在当前这轮搜索中该点未被访问
#include <bits/stdc++.h>
using namespace std ;#define int long long char a[1005][1005] ;
int vis[1005][1005] ; 
int mem[1005][1005] ;
const int dir[4][2] = {  {1,0},{0,1},{-1,0} ,{0,-1}   } ;
int n, m ;int pos = 0 ;bool inmap(int x, int y)
{return x >= 0 && x < n && y >= 0 && y < n ; 
}int bfs(int x, int y)
{if(mem[x][y] != -1) return mem[x][y];pos ++ ; vector<pair<int,int>> visited;queue<pair<int,int>> q;q.push({x, y});visited.push_back({x, y});vis[x][y] = pos; int cnt = 1;while(!q.empty()){int dx = q.front().first;int dy = q.front().second;q.pop();for(int i = 0; i < 4; i++){int indx = dx + dir[i][0];int indy = dy + dir[i][1];if(inmap(indx, indy) && vis[indx][indy] != pos) {if(a[dx][dy] != a[indx][indy]){vis[indx][indy] = pos;cnt++;visited.push_back({indx, indy});q.push({indx, indy});}}}}for(auto [xx, yy] : visited) {mem[xx][yy] = cnt;}return cnt;
}signed main()
{ios::sync_with_stdio(false), cin.tie(nullptr); cin >> n >> m ;memset(mem, -1, sizeof(mem));memset(vis, 0, sizeof(vis));for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){cin >> a[i][j] ;}}for(int i = 0; i < m; i++){int x, y;cin >> x >> y ;x--; y-- ;cout << bfs(x, y) << "\n" ;}return 0 ;
}

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

相关文章:

  • IBM Plex字体:企业级开源字体解决方案完全指南
  • VoiceFixer语音修复工具:一键解决音频噪音、低质量问题的终极方案
  • 2026年想在广州做靠谱全屋定制?哪家公司才是你的最优之选?
  • 智慧职教自动化学习助手:3分钟掌握高效学习新方法
  • 2026年铝艺厂家实力排行/铝艺大门,别墅庭院大门 - 品牌策略师
  • 备考安徽省考计算机?这份超全的Office 2016 + C语言 + SQL Server实战指南请收好
  • B站会员购抢票脚本:3种高效通知方案实战指南
  • AI 写论文哪个软件最好?2026 真实评测:真文献 + 真图表 + 全流程,虎贲等考 AI 成毕业论文首选
  • 别再用轮询了!用OkHttp-SSE在Java后端实现AI对话的“打字机”效果
  • 软聚类与硬聚类的转换原理及工程优化实践
  • 多模态大语言模型空间推理能力优化实践
  • 2026知网降AI工具排行榜TOP5:实测哪款让毕业生不交智商税! - 我要发一区
  • 2026Q2西宁财税公司推荐|靠谱口碑标杆,工商注册+代理记账全程无忧 - 品牌智鉴榜
  • 机器人视觉动作生成:RFG与单步去噪技术对比
  • 别再当黑盒模型了!用SHAP可视化拆解你的随机森林回归预测(附Python代码)
  • Claude Code 深度拆解:Agent 执行内核 3 — 从 API 调用到安全退出
  • Vernclaw-Connect-CLI:可编程连接管理工具的设计与实战
  • 比话真的能把知网AI率降到15%以内吗?拆解售后政策+实测案例! - 我要发一区
  • OpenPLC Editor:工业自动化编程的免费开源完整解决方案实战指南
  • BepInEx 6.0.0框架深度解析:Unity插件架构的稳定性优化实战
  • FlexASIO实战指南:为Windows系统打造专业级低延迟音频解决方案
  • RFG与单步去噪在机器人视觉动作生成中的对比研究
  • OpenPLC Editor:开源工业控制编程环境的全面解析
  • 突破遮挡与身份错乱!MPMOT:让多目标跟踪更稳、更快、更准
  • Java RPG Maker MV/MZ文件解密器:解锁加密游戏资源的完整指南
  • PHP 8.9错误处理升级全解析(RFC #8821深度解码)
  • ArcGIS Pro二次开发实战:手把手教你用C#批量将非标数据‘塞’进国土空间规划空库
  • BMAM架构:基于脑科学的多轮对话AI记忆系统设计
  • 从‘看不见’到‘看得清’:详解ENVI中的FLAASH大气校正到底在帮你纠正什么?
  • 保姆级教程:用Python监听EMQX设备上下线,并实时写入MySQL数据库