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;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PKU_ZZY/article/details/51517223
个人分类: Algorithm
想对作者说点什么? 我来说一句

城堡问题

城堡问题

fanke666 fanke666

2017-04-09 14:26:33

阅读数:310

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭