百练2815:城堡问题

一、【题目描述】

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

输入
程序从标准输入设备读入数据。第一行是两个整数,分别是南北向、东西向的方块数。在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数字表示方块周围的墙,※1表示西墙,2表示北墙,4表示东墙,8表示南墙。※每个方块用代表其周围墙的数字之和表示。城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。输入的数据保证城堡至少有两个房间。
ps:注意※处
输出
城堡的房间数、城堡中最大房间所包括的方块数。结果显示在标准输出设备上。
样例输入
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

二、【题目分析】
①题意理解
由图一我们可以先画出样例输入的5个房间的图,如下所示

涂线部分就是各个房间,总共就是五个房间。其中第一个房间就是方块数目最多的房间,其方块数达到了9个。
在该题目中是使用矩阵来表示整个城堡的,不仅要看图,还要仔细看清楚题干其中“1表示西墙,2表示北墙,4我们表示东墙,8表示南墙。”应该被重点关注,博主就是没有仔细理清楚题目导致多花了不少时间 ≧ ﹏ ≦
在这上一点上可以画图来理解会更简单明了。

其中上图右边可以用于判断各个方块哪里有出路。
观察图一可以发现有的方块出路又不止一条,因此又要对此进行分类讨论,分为没有出路、一条出路、两条出路、三条出路和四条出路即各个方向都没有墙的情况。
②算法选择
通过纵观整个题目,我选择使用深度优先搜索实现。顺便来了解一下深度优先算法适合的情况。深度优先搜索适合解决必须走到最深处(例如对于树,须走到它的叶子节点)才能得到一个解的问题。通常利用递归实现,所以每次递归开始的时候要判断是否达到收敛条件,若达到了则得到一个可行解,若没达到,则对当前状态进行扩展(扩展的时候通常会根据实际情况过滤掉一些非法的状态,这个过程叫剪枝,适当的剪枝有时能极大地提高搜索的速度)
深度优先搜索算法的代码模板如下(在代码实现中也会被用到):

void dfs(type *input, type *path, int cur or gap, type *result) {if (数据非法) return 0; // 终止条件if (cur == input.size( or gap == 0)) { // 收敛条件将 path 放入 result}if (可以剪枝) return;for(...) { // 执行所有可能的扩展动作执行动作,修改 pathdfs(input, step + 1 or gap--, result);恢复 path}
}

ps:此处有参考CSDN博主「一笑奈何_hnu」的原创文章
原文链接:https://blog.csdn.net/shineboyxxb/article/details/52200236
③代码实现

#include<iostream>
#include<cstdio>
using namespace std;
int a[100][100];
int n;
int k;
int cnt=0;//房间的个数
int maxs=0;//最大方块数
int s;  //用于计算方块数
bool v[256][256]={false};  //用于标记各个方块数是否被遍历过
void dfs(int x,int y){int t=a[x][y];  //t为当前矩阵表示的数字用于判断出路,要定义为此处的局部变量,若为全局变量则会出错 if(v[x][y]) return;  //假如该方块被标记遍历过 if(x<0||x>n)  //如果x不符合条件 return;if(y<0||y>k)//如果y不符合条件 return;if(t>15||t<0)//不符合题意 return; v[x][y]=true;//标记遍历过 s++;//每次属于一个房间内的方块进行累加 //各个方向无路走 if(t==15) return;//向右边走 else if(t==11)dfs(x,y+1);//向左边走 else if(t==14)dfs(x,y-1);//向上面走 else if(t==13)dfs(x-1,y);//向下面走 else if(t==7)dfs(x+1,y);//有两条路的情况下if(t==12){//向西、北走 dfs(x,y-1);dfs(x-1,y);} else if(t==10){//向西、东走 dfs(x,y-1);dfs(x,y+1);} else if(t==6){//向西、南走 dfs(x,y-1);dfs(x+1,y);} else if(t==9){//向东、北走 dfs(x,y+1);dfs(x-1,y);} else if(t==5){//向北、南走 dfs(x-1,y);dfs(x+1,y);} else if(t==3){//向东、南走 dfs(x,y+1);dfs(x+1,y);} //三条路的情况 if(t==1){//向北、东、南走 dfs(x-1,y);dfs(x,y+1);dfs(x+1,y);} else if(t==2){//向东、南、西走 dfs(x,y+1);dfs(x+1,y);dfs(x,y-1);}  else if(t==4){//向南、西、北走  dfs(x+1,y);dfs(x,y-1);dfs(x-1,y);}  else if(t==8){//向西、北、东走 dfs(x,y-1);dfs(x-1,y);dfs(x,y+1);}  //没有墙if(t==0) {dfs(x,y+1);dfs(x+1,y);dfs(x,y-1);dfs(x-1,y);}
}
int main(){int i,j,cnt=0; cin>>n>>k;//输入南北向,东西向的方块数 for(i=1;i<=n;i++){for(j=1;j<=k;j++){cin>>a[i][j];}} for(i=1;i<=n;i++){for(j=1;j<=k;j++){if(!v[i][j]){//假如没有被标记过 s=0;  // 遍历属于一个房间的方块时候初始化方块数为0 dfs(i,j);if(s>maxs)maxs=s; //在maxs和s中选择较大的 ,以求出最大房间包含的方块数 cnt++;//房间数加一 }}} cout<<cnt<<endl;cout<<maxs<<endl;return 0;
}

此处附上百练AC截图

百练2815:城堡问题题解 深度优先搜索解法相关推荐

  1. 百练2815 城堡问题

    题目要求 总时间限制:1000ms 内存限制:65536kB 题目描述 Wall | = No wall – = No wall 图1是一个城堡的地形图. 请你编写一个程序,计算城堡一共有多少房间,最 ...

  2. 百练2815:城堡问题(DFS)

    描述 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # ...

  3. 百练2787:算24题解

    2787:算24 查看 提交 统计 提示 提问 总时间限制:  3000ms  内存限制:  65536kB 描述 给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一 ...

  4. 九度 1420 Jobdu MM分水果 -- 动态规划、深度优先搜索

    题目地址:http://ac.jobdu.com/problem.php?pid=1420 题目描述: Jobdu团队有俩PPMM,这俩MM干啥都想一样.一天,富强公司给团队赞助了一批水果,胡老板就把 ...

  5. 程序设计入门经典题解(百练篇)

    参考链接:PKU百练题解(Bailian) Bailian1017 装箱问题[贪心] - 海岛Blog - CSDN博客 POJ1088 Bailian1088 滑雪[DFS+记忆化搜索]_海岛Blo ...

  6. 深度优先搜索之城堡问题

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

  7. 百练(十三~十六)题解

    百练(十三) Bailian2806 公共子序列[最长公共子序列+DP] - 海岛Blog - CSDN博客 Bailian3143 验证"歌德巴赫猜想"[筛选法]_海岛Blog- ...

  8. 百练(九~十二)题解

    百练(九) Bailian2801 填词 POJ1629 ZOJ1546 Fillword[排序] - 海岛Blog - CSDN博客 POJ1088 Bailian1088 滑雪[DFS+记忆化搜索 ...

  9. 学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举

    目录 一. 图解二叉树的深度优先搜索 二. 二叉树的广度优先搜索  (层序遍历) 三. 打开LeetCode 撸起来 至此, 咱多少被刚刚的后序非递归搞得可能有点小晕晕的, 没事,层序简单呀....  ...

  10. C++算法复习之深度优先搜索(dfs)与解救小扣题解

    深度优先搜索(Depth First Search) 深度优先搜索,一种非常快速的 搜索方式,接下来我们将主要讨论: 搜索方式 本质 应用 搜索方式 深度优先搜索原本是专门为树形图与无向图准备的,如下 ...

最新文章

  1. vCenter的安装
  2. python列表的小东西_Python---列表相关操作
  3. python3爬虫入门教程-python3爬虫入门程序
  4. 【错误记录】C 语言中通过指针操作字符串常量出错记录 ( 只有 栈内存 或 堆内存 中的数据才能通过指针修改 | 不要通过指针修改常量区的字符串 )
  5. (转载)Android性能优化典范
  6. 第一讲 无穷级数的概念
  7. linux c语言链表的简单应用之创建链表
  8. java 缓存的简单实现_Java8简单的本地缓存实现
  9. python发送json数据_在Websockets上发送JSON
  10. python3.7和2.7_为两个python版本(2.7和3.7)Windows 10安装pip
  11. Mac技巧|如何在 MacBook上设置一位数登录密码
  12. 在线HTML转JSX工具
  13. 【C#每日一帖】【转】提高编码效率的一些经验
  14. java中BorderLayout的使用方法
  15. 【转】推荐一款Java反编译器,比较好用
  16. dede php判断,织梦视频页面用PHP判断用户访问类型
  17. 以下哪些属于计算机应用领域,以下哪些计算机的应用领域?()
  18. redis基本命令和help使用
  19. 一文读懂 HTTP(超文本传输)协议
  20. 重装系统后电脑图片显示不出来怎么办

热门文章

  1. 深度学习——词汇embedded、Beam Search
  2. 火龙果(redpitaya)开发板常用接口C语言开发指南(一)——环境配置(持续更新中)
  3. JavaWeb - 小米商城:用户注册
  4. 安全 | 开源入侵防御系统 Snort
  5. S7-1200PLC通过增量式编码器实现速度采集和模拟量采集
  6. CSS3与页面布局学习总结(四)——页面布局大全
  7. pages.json tabBar[‘list‘][2][‘pagePath‘] “pages/contact/contect“ 需在 pages 数组中
  8. (十九)通俗易懂理解——无人驾驶概述
  9. android内核调试
  10. java 文件传输 分块传输