poj 2815 城堡问题(搜索)

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;
}

你可能感兴趣的:(poj 2815 城堡问题(搜索))