思路:

1. 一开始想着把墙当成图的一部分记下来,但发现比较麻烦而且不会区分没有墙和房间的地方;可以把墙当作判定条件之一在方位循环里处理。

2.这是典型的连通块问题:在主函数里循环找另外的节点,再对该节点展开深搜,标记可以走到的点,直到没有点可以走为止。(简洁版:标记这个点,标记符合条件的相邻点,对相邻点进行深搜)

3.墙用二进制表示与方向向量匹配。

易错:

x表示行, y表示列(但x是纵向走的,y是横向走的)

描述

     1   2   3   4   5   6   7  #############################1 #   |   #   |   #   |   |   ######---#####---#---#####---#2 #   #   |   #   #   #   #   ##---#####---#####---#####---#3 #   |   |   #   #   #   #   ##---#########---#####---#---#4 #   #   |   |   |   |   #   ##############################(图 1)#  = Wall   |  = No wall-  = No wall

图1是海拉鲁城堡的地形图。请你编写一个程序,计算该城堡一共有多少房间,最大的房间有多大。

城堡被分割成m×n(m≤50,n≤50)个方块,每个方块可以有0~4面墙。

输入

前两行是两个整数,分别是南北向、东西向的方块数(行和列)。

在接下来的输入行里,每个方块用一个数字p表示(0≤p≤50)。其二进制位为1代表有墙,为0代表无墙。

四面墙由整数P的后四位表示。最低位代表西墙(0001),第二位代表北墙(0010),第三位4表示东墙(0100),第四位表示南墙(1000)。

四个数相加的和就是每个方块的四面墙的状态。

输入数据中每个方块的内墙是重叠的,方块(1,1)的南墙同时也是方块(2,1)的北墙。

输入的数据保证城堡至少有两个房间。

输出

海拉鲁城堡的房间数、海拉鲁城堡中最大房间所包括的方块数。

结果显示在标准输出设备上。

输入样例 1

4
7
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13 

输出样例 1

5
9
//x是行, y是列 #include<iostream>
using namespace std;const int N = 55;
int m, n, cntroom, roomarea, maxarea;
int room[N][N];
bool st[N][N];void dfs(int x, int y){st[x][y] = true;++ roomarea;
//  cout << x * n + y << endl;
//  cout << roomarea << endl;int dx[] = {0, -1, 0, 1}, dy[] = {-1, 0, 1, 0};for(int i = 0; i < 4; ++ i){int nx = dx[i] + x, ny = dy[i] + y;//cout << 'a' << endl;//cout << nx << ' ' << ny << endl;if(nx < 0 || nx >= m || ny < 0 || ny >= n) continue;//cout << 'b' << endl;if(st[nx][ny]) continue;//cout << (room[x][y] >> i & 1) << endl;if(room[x][y] >> i & 1) continue;dfs(nx, ny);}
}int main(){cin >> m >> n;for(int i = 0; i < m; ++ i){for(int j = 0; j < n; ++ j){cin >> room[i][j];}}    for(int i = 0; i < m; ++ i){for(int j = 0; j < n; ++ j){if(!st[i][j]){++ cntroom; roomarea = 0;dfs(i, j);//  cout << cntroom <<' ' << roomarea << endl;maxarea = max(maxarea, roomarea);}}}   cout << cntroom << endl;cout << maxarea;
}

海拉鲁城堡问题(dfs连通块)相关推荐

  1. C.十面埋伏(DFS连通块)

    C.十面埋伏(DFS&连通块) 题目传送门 题意:将"#"图案用星号围一圈并输出图. 思路:显然从外围DFS,判断一下四周有无#即可. AC代码: #include< ...

  2. HDU - 1547 Bubble Shooter(dfs+连通块+模拟)

    题目链接:点击查看 题目大意:模拟泡泡枪游戏,问当击破指定位置的泡泡时,能有多少个泡泡同时爆炸? 题目分析:一个中规中矩的连通块问题,只不过在向四周扩散的时候需要注意的是,奇数行和偶数行的方向有点不一 ...

  3. 中石油训练赛 - Bee Problem(dfs+连通块)

    题目描述 You are a busy little bee, and you have a problem. After collecting nectar all day long, you ar ...

  4. Multiplayer Moo[ [ 并查集+dfs连通块 ] / [ dfs ] ]

    题目链接 题目描述: The cows have come up with a creative new game, surprisingly giving it the least creative ...

  5. *【ZOJ - 3781】Paint the Grid Reloaded(dfs求连通块缩点,bfs求最短路,建图技巧)

    题干: Leo has a grid with N rows and M columns. All cells are painted with either black or white initi ...

  6. [C] [编程题]连通块(DFS解决)

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 256M,其他语言512M 来源:牛客网 金山办公2020校招服务端开发工程师笔试题(一) 题目描述 给一个01矩阵,1代表是陆地,0代表 ...

  7. UVa572 Oil Deposits DFS求连通块

    技巧:遍历8个方向 for(int dr = -1; dr <= 1; dr++)for(int dc = -1; dc <= 1; dc++)if(dr != 0 || dc != 0) ...

  8. DFS求连通块数目(深搜)

    DFS求连通块数目 这里认为,连通块是包括斜对角线的路径连通的块. 测试数据 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 计算通过@相连的连通块的个数 测试输出: 2 样例代码 ...

  9. [uva]AncientMessages象形文字识别 (dfs求连通块)

    非常有趣的一道题目,大意是给你六种符号的16进制文本,让你转化成二进制并识别出来 代码实现上参考了//http://blog.csdn.net/u012139398/article/details/3 ...

最新文章

  1. Android 之 沉浸式状态栏及顶部状态栏背景色设置
  2. msdn关于Visual C++ 编译器选项的说明
  3. python自学笔记(三)python基本数据类型之列表list
  4. WINCE6.0添加对viewrs(PDF,Word,Execel和PowerPoint)支持
  5. Jmeter之ForEach控制器(配合正则表达式使用)
  6. eoj程序设计基础(基于 C 语言)1067
  7. [原]正则表达式模式匹配入门
  8. [计蒜客]T1853 非常男女
  9. antd 轮播图样式_antd-design 的轮播图组件Carousel如何在初始化的时候自动跳转到特定图片...
  10. 【SpringBoot_ANNOTATIONS】 生命周期 03 @PostConstruct @PreDestroy
  11. UIFont各种字体
  12. 开源协议及应用 (BSD/GPL/LGPL/Apache/MIT)
  13. 信号预处理电路(三角波和正弦波转换成方波)
  14. 【USB描述符系列】二维码扫描枪
  15. 复旦计算机可以跨专业吗,I直达录取现场I2020,还能跨考计算机吗?
  16. 这15部评分9.0以上纪录片,让你放假后足不出户就可以看遍世界!(附链接)
  17. 003. 电话号码的字母组合——回溯算法
  18. JDK.8源码阅读项目搭建之记录
  19. ios rsa加密 java解密_iOS RSA加密与解密 签名与验签(附Java端处理)
  20. Jquery选择器之可见性选择器、属性过滤选择器

热门文章

  1. 谈谈物哀与日本文化中的生死观
  2. 老鼠和奶酪【力扣2611】
  3. 音乐制作软件中文版-Cakewalk Sonar Producer Edition 6.0 WiN
  4. 前端动态生成数组/获取数组对象中的最值
  5. 手机上的照片删除了能恢复吗?教你怎么从小白变高手!
  6. .tlb, .tlh, .tli文件
  7. 国内外人工智能AI工具网站大全(一键收藏,应有尽有)
  8. java excel导出复杂表头_java excel复杂表头和复杂数据导出
  9. flyme android 7 root,魅族Pro7如何获取root权限?利用系统自带root工具即可!
  10. 幼儿园管理之“三贴近”