题目分析


来源:acwing

分析:找房间个数,也就是找连通的个数。
样例画出来的房间个数如下图:其中’|‘ 和’-'不是墙,只有#是墙。

分析:这题不用建图,直接bfs(flood fill)来做,求连通块的个数,并且求每个连通块中方块的个数。

  1. 由于墙用数字表示,分别是1,2,4,8正好对应的是二进制的某一位。所以直接通过二进制状态压缩来bfs。
  2. flood fill模板题。 需要统计的是area和cnt(连通块的个数),前者在bfs中入队列的点的数目就是area;后者可以在main函数中来做,因为每进行一次bfs就是连通块个数加1.

AC代码

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N = 55,  M = N * N;
typedef pair<int, int> PII;
int n,m;
int g[N][N];
PII q[M];
bool st[N][N];int bfs(int sx, int sy){int  dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1 , 0};int hh = 0, tt = 0;int area = 0;q[hh] = {sx, sy};st[sx][sy] = true;while( hh <= tt){PII t = q[ hh ++];// 出队的时候统计连通块的个数,即房间面积area ++;for(int i = 0; i < 4; i ++){int a = t.x + dx[i], b = t.y + dy[i];if( a < 0 || a >= n || b < 0 || b >= m) continue;if( st[a][b]) continue;// 如果有墙,过不来// 因为用1,2,4,8表示四面墙,对应的就是二进制位哪一位为1// g[t.x][t.y] >> i & 1 表示从(t.x,t.y)沿着i方向到(a,b)有墙if( g[t.x][t.y] >> i & 1) continue;// 符合条件,即连通块,入队列q[ ++ tt] = {a,b};st[a][b] = true;}}return area; // 返回面积大小
}int main(){cin >> n >> m;for(int i = 0; i < n; i ++)for(int j = 0; j < m; j++)cin >> g[i][j];int cnt = 0, area = 0;for(int i = 0; i < n; i ++)for(int j = 0; j< m; j++)if(!st[i][j]){area = max(area, bfs(i, j));cnt ++; // 统计连通块的个数}cout << cnt << endl << area <<endl;
}

题目来源

https://www.acwing.com/problem/content/1100/

算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs相关推荐

  1. 算法提高课-搜索-双向广搜 AcWing 190. 字串变换:bfs、双向bfs、queue和unordered_map

    题目分析 来源:acwing 分析: 双向广搜主要用在最小步数模型(也称状态图模型)里面,这里整个状态空间一般是指数级别的,用双向广搜可以极大地提高运行效率. 双向广搜,顾名思义,就是从起点和终点都进 ...

  2. 算法提高课-搜索-最小步数模型-AcWing 1107. 魔板:bfs、复杂、八数码类似的题目

    题目分析 来源:acwing 分析: 最小步数模型常用哈希 按照ABC的顺序来搜,得到的是字典序最小的. 这里整幅"图"是一个状态, 装进一个字符串中,然后一个状态改变到另一个状态 ...

  3. 算法提高课-搜索-最短路模型-AcWing 1100. 抓住那头牛:bfs

    题目分析 来源:acwing 分析:bfs求最短步数,需要dist[]数组来记录最短步数. ac代码 #include<bits/stdc++.h> using namespace std ...

  4. 算法提高课-搜索-最短路模型-AcWing 188. 武士风度的牛 :bfs、dist数组记录最小步数

    题目分析 来源:acwing 分析:马走日,这里用bfs遍历马的行走过程,输出到达终点的最小步数. 使用bfs求到每个点的最小步数,需要开一个dist[][]数组,来记录起点到某点的最小步数. 队列里 ...

  5. 算法提高课-搜索-最短路模型-AcWing 1076. 迷宫问题:bfs最短路、路径

    题目分析 分析: bfs求最短路,主要原因是因为bfs是一层一层的搜,当第一次搜到终点的时候,其实就是到终点的最短路. 本题bfs倒着搜,从终点(n-1,n-1)开始搜,记录到每个点的路径nxt[][ ...

  6. 算法提高课-搜索-Flood fill算法-AcWing 1106. 山峰和山谷:flood fill、bfs

    题目分析 来源:acwing 分析:这道题还是flood fill算法的应用,不同点在于八个方向扫描,习惯性采用二重循环来扫描周围的8个方向:其次,这里需要统计周围比它高的和比它矮的,这点用bool变 ...

  7. 算法提高课-搜索-Flood fill算法-AcWing 1097. 池塘计数:flood fill、bfs

    Flood fill 算法简介: 像洪水一样,一圈一圈往外蔓延,像bfs. flood fill 算法可以在线性复杂度内,找到某个点所在的连通块. 题目分析 来源:acwing ac代码 #inclu ...

  8. 算法提高课-搜索-A*(A star)算法-AcWing 179. 八数码:A星算法求解

    题目分析 来源:acwing 分析: A*算法是什么呢? A算法是一种bfs的变式,需要用到一个"估价函数",用来计算任意状态到目标状态所需代价的估计值.然后在搜索中,维护一个堆, ...

  9. 算法提高课-搜索-双端队列广搜-AcWing 175. 电路维修:deque、bfs、有点难

    题目分析 来源:acwing 只有边权为0和边权为1,两种情况.什么意思呢?两个点之间存在路径则边权为0,需要转一下连通的边权为1. 每个点可能入队多次,本质上是个dijkstra算法. 下图说明bf ...

最新文章

  1. pip卸载模块/宏包(python)
  2. 44. 源代码解读-RocketMQ-架构
  3. AsyncHttpClient的连接池使用逻辑
  4. python websocket异步高并发_高并发异步uwsgi+web.py+gevent
  5. 【p081】ISBN号码
  6. 计算机专业中职好就业不,内江计算机专业中职好不好
  7. 辨异 —— 中文词汇
  8. 借书问题(入门级算法)(C语言)
  9. matlab geodetic2ecef,卫星轨道问题
  10. 给小学生科普计算机知识,小学生科普知识演讲稿
  11. C++ 完全不完全资源导引
  12. Linux 安装PostgreSql
  13. 把steam上下载的GTA5转移到Epic中,免除Epic再次下载GTA5的方法
  14. ubuntu18.04系统安装+基本环境配置【原创】
  15. 计算机安装调试维修员中级习题,计算机安装调试维修员培训计划(三级)
  16. 基于java/php/python的毕业设计管理系统开题报告
  17. ubnutu下载网易云音乐
  18. 软件工程(三)软件可行性研究
  19. 微软CCID智能卡读卡器驱动(Microsoft Class Drivers for USB CCID Smart Cards)
  20. 人员动作行为AI分析系统 yolov5

热门文章

  1. Tomcatserverhttps协议配置简单介绍
  2. 重建输入表 - 脱壳篇04
  3. 关于 UDP Hole Punching 的资料
  4. 各模组相关interface
  5. linux cat 命令详解
  6. 带卷积核二分类网络的输出是不是有方向的?
  7. sql server 多条记录数据合并为一条_如何利用Python实现SQL自动化?
  8. 【控制】《多无人机协同控制技术》周伟老师-第2章-多无人机协同控制体系结构
  9. 【控制】《多无人机协同控制技术》周伟老师-第1章-无人机协同控制技术概述
  10. Ubuntu 12.04 下编译Android 4.0.3