2815:城堡问题
总时间限制:
1000ms
内存限制:
65536kB
描述
1 2 3 4 5 6 7
#############################
1 # | # | # | | #
#####---#####---#---#####---#
2 # # | # # # # #
#---#####---#####---#####---#
3 # | | # # # # #
#---#########---#####---#---#
4 # # | | | | # #
#############################
(图 1)
# = Wall
| = No wall
- = No wall
图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成mn(m≤50,n≤50)个方块,每个方块可以有0~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
来源
1164
#include<bits/stdc++.h>
using namespace std;
#define MAX 100
int R, C;//行列数
int rooms[MAX][MAX];//录入数据
int color[MAX][MAX];//用来给已经搜索过的方格染色
int maxRoomArea = 0, roomNum = 0;//分别记录最大房间面积和房间个数
int roomArea;//每次搜索时暂存每个房间的面积
void Dfs(int i, int k) {
if (color[i][k])//如果此方格已搜索过
return;
++roomArea;//如果没搜索
color[i][k] = roomNum;//染色为当前房间数,从而实现同一个房间的方格染色的数字都是相同的
if ((rooms[i][k] & 1) == 0)Dfs(i, k - 1);//说明没西墙,可往西走
if ((rooms[i][k] & 2) == 0)Dfs(i - 1, k);//往北走
if ((rooms[i][k] & 4) == 0)Dfs(i, k + 1);//往东走
if ((rooms[i][k] & 8) == 0)Dfs(i + 1, k);//往南走
}
int main(){
cin >> R >> C;
for (int i = 1; i <= R; i++)
for (int k = 1; k <= C; k++)
cin >> rooms[i][k];
memset(color, 0, sizeof(color));
for(int i=1;i<=R;i++)
for (int k = 1; k <= C; k++) {
if (!color[i][k]) {//如果该方格没被搜索过
++roomNum;//说明是新房间起点
roomArea = 0;//初始化新房间面积
Dfs(i, k);//开始搜索
maxRoomArea = max(roomArea, maxRoomArea);//每搜索完都及时更新最大房间面积
}
}
cout << roomNum << endl << maxRoomArea;
return 0;
}
这篇博客介绍了如何运用深度优先搜索算法(DFS)来解决一个关于城堡地形图的问题。给定一个由数字表示的城堡地图,每个数字表示周围墙壁的状态,任务是计算城堡内的房间数量以及最大的房间大小。输入包含城堡的行数和列数,以及每个方块的墙壁信息。程序通过DFS遍历未访问过的方块,并为每个新房间染色,同时计算房间的面积。样例输入和输出展示了算法的正确性,输出结果包括房间总数和最大房间面积。
3827

被折叠的 条评论
为什么被折叠?



