1. 比赛概况:
比赛共 4 题,满分 400 分,时间 90 分钟。
2. 比赛题目:
第一题:武士风度的牛
第二题:抓住那头牛
第三题:仙岛求药
第四题:The Castle
3. 补题报告:
第四题:The Castle
题目:
时间限制:1秒 内存限制:128M
题目描述
一座城堡被分成m*n个方块(m≤50,n≤50),每个方块可有0~4堵墙(0表示无墙)。下面示出了建筑平面图:
图中的加粗黑线代表墙。几个连通的方块组成房间,房间与房间之间一定是用黑线(墙)隔开的。
现在要求你编一个程序,解决以下2个问题:
1、该城堡中有多少个房间?
2、最大的房间有多大?
输入描述
平面图用一个数字表示一个方块(第1个房间用二进制1011表示,0表示无东墙,用十进制11表示)。
第一行一个整数m(m≤50),表示房子南北方向的长度。
第二行一个整数n(n≤50),表示房子东西方向的长度。
后面的m行,每行有n个整数,每个整数都表示平面图对应位置的方块的特征。每个方块中墙的特征由数字P来描述(0≤P≤15)。数字P是下面的可能取的数字之和:
1(西墙 west)
2(北墙 north)
4(东墙 east)
8(南墙 south)
室内的墙被定义两次: 例如方块(1,1)中的南墙也被位于其南面的方块(2,1)定义了一次。
建筑中至少有两个房间。
输出描述
第1行:一个整数,表示房间总数;
第2行:一个整数,表示最大房间的面积(方块数)。
样例
输入
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
题解:
先看题目描述:
题目描述让我们求房间数和最大房间面积,也就是连通区域数和最大连通区域,所以我们可以用DFS解决。
再看输入描述:
输入描述告诉我们一个十进制数表示一个方块,它的二进制可以表示它周围墙的特征,所以我们还要用到十进制转二进制。
最后写代码:
定义:
- m和n,表示行和列。
- t,用来输入。
- pos,下标指示器。
- 三维数组a,表示每个方块周围墙的特征。
- vis数组,用来DFS。
- temp,表示当前连通区域的面积。
- cnt,表示连通区域数。
- maxx,表示最大连通区域的面积。
- dx和dy数组,方向数组。
主函数:
输入n和m
循环输入十进制数,将下标指示器设为0,进行十进制转二进制,存到a数组里。
遍历每一个方块,如果未访问,那么将面积设为0,调用dfs函数。
dfs函数:
将这个点标记为已访问。
因为又找到了一块连通的方块,所以面积增加。
遍历面积数组:
更新下一步的位置。
如果下一步的位置未越界且未访问且没有墙,那么dfs(下一个位置)。
主函数:
dfs函数调用结束,连通区域数增加,更新最大连通区域面积。
输出连通区域数和最大连通区域面积。
AC 代码: