洛谷P1141 01迷宫【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1141
题意:
有一个填了0和1的n*n的格子,只能0走到1,1走到0
有m组询问(数据量是1e5),问某一个格子可以到达的格子数。
思路:
刚开始一直在想记忆化搜索。某一个格子走过了之后的格子数记下来,之后访问到的时候加上。
但是这样会重复的。比如(x,y)走到(i,j),他们能走到的格子是有交集的,并不是包含的关系。
应该要想到 连通块。
给定的这个图形成了若干的连通块。我们只需要预处理一下这些连通块,对于每次询问查询他对应的连通块的大小就行了。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<map> 4 #include<set> 5 #include<iostream> 6 #include<cstring> 7 #include<algorithm> 8 #include<vector> 9 #include<queue> 10 11 using namespace std; 12 typedef pair<int, int> pr; 13 14 int n, m; 15 int mat[1005][1005]; 16 int dx[4] = {1, -1, 0, 0}; 17 int dy[4] = {0, 0, 1, -1}; 18 19 int id[1005][1005]; 20 int cnt[1000005]; 21 22 bool check(pr p) 23 { 24 int i = p.first, j = p.second; 25 return (i > 0 && i <= n && j > 0 && j <= n); 26 } 27 28 void bfs(int i, int j, int k) 29 { 30 int c = 1; 31 queue<pr>que; 32 pr st = make_pair(i, j); 33 que.push(st); 34 id[i][j] = k; 35 while(!que.empty()){ 36 pr now = que.front();que.pop(); 37 for(int i = 0; i < 4; i++){ 38 pr tmp = make_pair(now.first + dx[i], now.second + dy[i]); 39 if(check(tmp) && !id[tmp.first][tmp.second] && mat[tmp.first][tmp.second] ^ mat[now.first][now.second]){ 40 id[tmp.first][tmp.second] = k; 41 que.push(tmp); 42 c++; 43 } 44 } 45 } 46 cnt[k] = c; 47 } 48 49 int main() 50 { 51 scanf("%d%d", &n, &m); 52 for(int i = 1; i <= n; i++){ 53 char s[1005]; 54 scanf("%s", s); 55 for(int j = 1; j <= n; j++){ 56 mat[i][j] = s[j - 1] - '0'; 57 } 58 } 59 int now_id = 1; 60 for(int i = 1; i <= n; i++){ 61 for(int j = 1; j <= n; j++){ 62 if(!id[i][j]){ 63 bfs(i, j, now_id); 64 now_id++; 65 } 66 } 67 } 68 69 for(int i = 0; i < m; i++){ 70 int x, y; 71 scanf("%d%d", &x, &y); 72 printf("%d\n", cnt[id[x][y]]); 73 } 74 75 return 0; 76 }
转载于:https://www.cnblogs.com/wyboooo/p/10354934.html
洛谷P1141 01迷宫【bfs】相关推荐
- 洛谷P1141 01迷宫【记忆化搜索】
题目链接:P1141 01迷宫 程序说明: 可以用bfs来做,但是数据毒瘤,如果每次询问都运行一次bfs,会有三个TLE..可以将路途经过的点储存起来并且记录答案,如果询问的点已经被记录了答案,直接输 ...
- 洛谷P1141 01迷宫
因为各种乱七八糟的原因,学搜索实在是学了太久了也咕了好久博客啊.准备再做一遍之前写过的题顺便补一下博客qwq 01迷宫 [题目链接](https://www.luogu.org/problemnew/ ...
- 洛谷 P1141 01迷宫(dfs)
https://www.luogu.org/problem/P1141 思路:找到每一个连通块,不同连通块的标记不同,给标记赋值成该连通块的数量 1 // luogu-judger-enable-o2 ...
- P1141 01迷宫(BFS+记忆化)
https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样 ...
- 洛谷 P1238 走迷宫【搜索】【DFS】
洛谷 P1238 走迷宫 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 洛谷 P1238 走迷宫 二.题目分析 (一)算法标签 搜索 DFS ( ...
- bfs:01迷宫(洛谷P1141)
洛谷传送门 解析 乍一看:bfs板子题 冰法师最棒了 然鹅 看了一眼数据范围 心中已有画面 <面 堂 发 黑> 怎么办嘞? 我们想到: 因为该题来与去的可逆性 我们搜一次后,这些点以后都不 ...
- 洛谷P1363 幻象迷宫(DFS)
输入样例#1: 5 4 ##.# ##S# #-# #.## #-# 5 4 ##.# ##S# #-# -#. #.## 输出样例#1: Yes No 大概就是说给出一个01迷宫类的地图,按照这个地 ...
- 2019.03.04【ZJOI2018】【BZOJ5213】【洛谷P4339】迷宫(自动机)(数论)
BZOJ传送门 洛谷传送门 解析: 这道题本质其实是要最小化一个能够接受所有mmm进制下KKK的倍数的自动机. 显然我们有一个方案就是KKK个节点,iii的第jjj条边向(i∗m+j)%K(i*m+j ...
- 01迷宫(洛谷-P1141)
题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫, ...
- 洛谷oj P2802 回家(BFS)
题目链接 简单说下题意,就是给一个迷宫.一开始有6滴血,走一步掉一滴.路上有补血包,问能不能在血量>=1的情况下到达终点. 这题其实就是HDU上面的1072.个人做题习惯搜索题最短路一般用BFS ...
最新文章
- Eclipse详细设置护眼背景色和字体颜色并导出
- Java并行有优势吗_Java中不同的并发实现的性能比较
- CPU上下文切换(系统调用、进程上下文、线程上下文、中断上下文)
- 纪念品分组java_纪念品分组 ——易懂、简介、技巧(Java代码)
- java invocationtarget,Java异常处理之java.lang.reflect.InvocationTargetException
- iBATIS In Action:iBATIS的安装和配置
- Linux基础-网络配置
- 微信小程序的剪贴板 +复制剪贴,在淘宝中打开就可以获取到商品
- session同步问题
- Python Apex 武器自动识别与压枪 全过程记录
- 玩转BIOS与注册表
- js逆向——百度翻译
- 继电反馈法自整定_PID控制及整定算法
- 民营企业该如何留住人才
- 2012年8月22日
- 网站入侵工具之wscan使用详解
- Logisitc Regression 预测员工离职率
- Wos/Pubmed/Scopus数据库一键去重+清洗数据 CiteSpace Vosviewer
- explore_UserGuide
- Tomcat基本使用以及项目部署。
热门文章
- bci测试如何整改_电源动态响应测试,什么样的波形算合格?
- python对数组的操作_Python Numpy库对数组的操作详解,
- svn服务器搭建和使用_使用Gitea搭建自己的Git服务器
- 文本文件与二进制的区别
- react如何写ajax,请问如何在React中做Ajax 请求?
- 进位位判别法_''进位-判断-执行''的通用思想
- 多人麻将源码 html5,新版大众麻将 H5版
- 【hdu1018】Big Number(求n!的位数----斯大林公式/log函数)
- 如不指定存储类型c语言,总结C语言的五种存储类型
- Operation和OperationQueue实战:异步下载图片并给图片加滤镜