您的位置:首页 > 其它

poj 2815 城堡问题(搜索)

2016-05-27 15:38 316 查看
poj 2815 城堡问题(搜索)

总时间限制: 1000ms 内存限制: 65536kB

描述



(图 1)

# = Wall

| = No wall

- = No wall

图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成m*n(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

对于搜索统计房间的题目,变形比较精彩的有两个题,一个是潘多拉星球的悬浮公寓,另一个就是这个题。

Accepted    260kB   0ms 684 B   G++


#define MAX_SIZE 50

#include<stdio.h>

const int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};

int r,c,rooms=0,max_area=0,area;
int wall[MAX_SIZE][MAX_SIZE],visit[MAX_SIZE][MAX_SIZE];

void dfs(int i,int j)
{
area++;
visit[i][j]=true;
for (int t=0;t<4;t++)
if (!visit[i+dir[t][0]][j+dir[t][1]]&&!(wall[i][j]&(1<<t)))
dfs(i+dir[t][0],j+dir[t][1]);
return;
}

int main()
{
scanf("%d%d\n",&r,&c);
for (int i=0;i<r;i++)
for (int j=0;j<c;j++)
scanf("%d",&wall[i][j]);
for (int i=0;i<r;i++)
for (int j=0;j<c;j++)
if (!visit[i][j])
{
rooms++;
area=0;
dfs(i,j);
if (area>max_area)
max_area=area;
}
printf("%d\n%d\n",rooms,max_area);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: