问题描述

下图是一个城堡的地形图,请你编写一个程序,计算城堡一共有多少个房间,最大的房间有多大。城堡被分割成mxn(m<=50,n<=50)个方块,每个方块可以有4面墙。

#代表墙,|-代表不是墙,走的通的就是一个房间

输入
程序从标准输入设备读入数据。
第一行是两个整数,分别是南北向、东西向的方块数。
在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数字表示方块周围的墙,1表示西墙, 2表示北墙, 4表示东墙, 8表示南墙。每个方块用代表其周围墙的数字之和表示。城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,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

样例输入

5
9

解题思路

第一步要解决的问题就是计算某个方块周围有几面墙,通过一个数字要算出有几面墙,我们发现1,2,4,8,他们的二进制位分别为0001,0010,0100,1000.比如给数3,我们看它有几个1来表示,如果最后1位为1表明有西墙,倒数第二位有1表示有北墙,我们可以让它与1或者2作&操作,比如6与4与操作,6是0110,4是0100,两者相与仍为4。

我们可以把方块看作是节点,相邻两个方块之间如果没有墙,则在方块之间连一条边,这样城堡就能转换为一个图。
求房间个数,实际上就是在求图中有多少个极大连通子图。
一个连通子图,往里头添加任何一个图里的其他店,就会变得不连通,那么这个连通子图就是极大连通子图(如:(8,5,6))
对每一个房间,深度优先搜索,从而给这个房间能够到达的所有位置染色,最后统计一共用了几种颜色,以及每种颜色的数量。

比如
1 1 2 2 3 3 3
1 1 1 2 3 4 3
1 1 1 5 3 5 3
1 5 5 5 5 5 3
从而一共有5种房间,最大的房间(1)占据9个格子

程序代码

#include<iostream>
using namespace std;
#define MAXSIZE 50
int rooms[MAXSIZE][MAXSIZE];            //存储方块和它周围墙的情况
int color[MAXSIZE][MAXSIZE];        //存储连通图的颜色情况,也可以标记这一点有没有被访问过。
int roomNum=0,maxRoomArea=0;          //表示房间数和最大房间的面积
int roomArea;                   //房间的面积
int m;      //行数
int n;      //列数
//从rooms[i][j]这个方块出发,进行探索
void dfs(int i,int j){if(color[i][j]!=0){      //这一点已经被访问过 return ;} color[i][j]=roomNum;     //染色并标记为已访问++roomArea;//如果rooms[i][j]十六进制从右往左第1位为1的话,那么就说明有西墙 if(((rooms[i][j]&1)==0)&&(j>=2)){dfs(i,j-1);           //访问西 }if(((rooms[i][j]&2)==0)&&(i>=2)){dfs(i-1,j);           //访问北 }if(((rooms[i][j]&4)==0)&&(j<=n-1)){dfs(i,j+1);            //访问东 }if(((rooms[i][j]&8)==0)&&(i<=m-1)){dfs(i+1,j);            //访问南} }int main(){cin>>m>>n;//读入方块,并把color数组全部置为0,即刚开始每个方块都没有走过 for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){cin>>rooms[i][j];color[i][j]=0;}} //依次访问二维数组中每个结点 for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(color[i][j]==0){           //看某个结点是否被染色,即是否走过,//如果没有走过,就意味着找到了一个新的房间,将其视为这个房间的起点,进行一趟dfs,就可以将这个房间里面所有方块都染色。roomNum++; roomArea=0; dfs(i,j);       //第i行第j列这个方块进行探索//探索完以后当前这个房间的面积就求出来了,然后就要更新maxRoomArea; maxRoomArea=roomArea>maxRoomArea?roomArea:maxRoomArea;}}} //输出房间数 cout<<roomNum<<endl;cout<<maxRoomArea;
}

深度优先搜索之城堡问题相关推荐

  1. 迷宫问题的求解(广度和深度优先搜索)

         迷宫问题主要可以分为两类,一个是深度优先搜索和广度优先搜索.      广度优先搜索常用于求最优解(如最短时间,最优路径等),站在一个点上,首先试一试自己周围的点是否可以走,如果是路则加入待 ...

  2. 深度优先搜索(DFS)与广度优先搜索(BFS)算法详解

    深度优先搜索(DFS)与广度优先搜索(BFS)详解 1.广度优先搜索算法 1.1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历 ...

  3. 算法:深度优先搜索(一)

    一.在图上寻找路径和遍历 在图上如何寻找从1到8的路径? 不连通的图,无法从节点1走到节点8 从起点出发,走过的点要标记,发现有没有走过的点,就随意挑选一个往前走,走不了就回退,此种路径搜索策略就称为 ...

  4. 【蓝桥杯】 算法提高 学霸的迷宫(深度优先搜索、BFS)

    算法提高 学霸的迷宫 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫.因为班 ...

  5. [C] 深度优先搜索解决连通块/染色问题——求岛的个数

    本文介绍用DFS解决连通块个数问题 有关dfs的介绍见另外一篇:不撞南墙不回头--深度优先搜索 例题 宝岛探险 题目描述 一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示 ...

  6. 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索

    0基础学算法 搜索篇第一讲 深度优先搜索 相信绝大多数人对于深度优先搜索和广度优先搜索是不会特别陌生的,如果我这样说似乎你没听说过,那如果我说dfs和bfs呢?先不说是否学习过它们,至少它们的大名应该 ...

  7. leetcode dfs_深度优先搜索:具有6个Leetcode示例的DFS图遍历指南

    leetcode dfs Have you ever solved a real-life maze? The approach that most of us take while solving ...

  8. 【ACM】杭电OJ 1241(深度优先搜索小结)

    题目链接:杭电OJ 1241 深度优先搜索问题 深度优先搜索是搜索的手段之一.它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解. ...

  9. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

最新文章

  1. CSS中的emmet语法(使用缩写的方式提高书写html编写速度)
  2. with open新创建的文件在哪找_Python 简明教程——24,Python 文件读写
  3. python编辑器安装视频教程_Python安装教程(推荐一款不错的Python编辑器)
  4. python实现编译器链接器_Python入门之Python编译器
  5. java fileinputreader_java BufferedReader,FileInputStream实现文本文件读/写
  6. 【VS插件】VS2012设置透明背景
  7. 软考网络工程师考试大纲
  8. NOI题库答案(1.3 编程基础之算术表达式与顺序执行)
  9. NAT穿透技术、穿透原理和方法详解
  10. PowerBuilder fileOpen()
  11. Canonical Coin Systems
  12. ccs中c语言定义布尔常量,ccs库里面有变量的定义,我在添加了头文件后编译显示没有定义变量呢...
  13. golang pederson commitment 实现,基于椭圆曲线
  14. Android仿微信朋友圈2自定义点赞评论弹框
  15. 编译原理知识点总结——字母表和串(附思维导图)
  16. 【LTE基础知识】LTE信令流程之开机附着、去附着流程分析
  17. 苹果个人账户转成公司账户
  18. session基本知识
  19. Excel---Lookup函数与数组
  20. python3字符处理——简繁体转换,只保留中文字母数字

热门文章

  1. 送货只服京东“特快送”:航空快件可送达近300个城市
  2. 又一国产手机宣布“退出群聊” 小米接盘:曾令万千女性着迷!
  3. 拳王虚拟项目公社:2020考研专业院校选择
  4. java webservice 客户端_Java Webservice客户端(最佳方法)
  5. stm32F051系列 单片机引脚定时器输出pwm波形控制风扇转速
  6. xlsx怎么设置行高列宽_7米面宽的3栋别墅,两款复式进深达到18米,第一款主体只要16万...
  7. vs 警告被视为错误
  8. shell学习笔记二则:统计空间
  9. 【Arthas】Arthas classloader类加载器
  10. 【Clickhouse】Clickhouse 整合 Prometheus 监控 运行时状态