Bailian2815 城堡问题【DFS】

2815:城堡问题
总时间限制: 1000ms 内存限制: 65536kB
描述

 1   2   3   4   5   6   7  

#############################
1 # | # | # | | #
#####---#####---#---#####---#
2 # # | # # # # #
#---#####---#####---#####---#
3 # | | # # # # #
#---#########---#####---#---#
4 # # | | | | # #
#############################
(图 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

问题链接Bailian2815 城堡问题
问题简述:(略)
问题分析
    本题与参考链接的题是同一题,代码可以直接AC。
程序说明:(略)
参考链接POJ1164 The Castle【DFS】
题记:(略)

AC的C语言程序如下:

/* POJ1164 The Castle */

#include <stdio.h>

int drow[] = {0, -1, 0, 1};
int dcol[] = {-1, 0, 1, 0};

#define N 50
int maze[N][N], n, m, sum, cnt;

void dfs(int row, int col)
{
    int s = maze[row][col], i;
    sum++;
    maze[row][col] = -1;
    for(i = 0; i < 4; i++) {
        if(s % 2 == 0) {
            int nrow = row + drow[i];
            int ncol = col + dcol[i];
            if(nrow >= 0 && nrow < n && ncol >= 0 && ncol < m && maze[nrow][ncol] != -1)
                dfs(nrow, ncol);
        }
        s /= 2;
    }
}

int main(void)
{
    int maxsum, i, j;
    while(scanf("%d%d", &n, &m) != EOF) {
        for(i = 0; i < n; i++)
            for(j = 0; j < m; j++)
                scanf("%d", &maze[i][j]);

        cnt = maxsum = 0;
        for(i = 0; i < n; i++)
            for(j = 0; j < m; j++)
                if(maze[i][j] != -1) {
                    sum = 0;
                    dfs(i, j);
                    cnt++;
                    if(sum > maxsum)
                        maxsum = sum;
                }

        printf("%d\n%d\n", cnt, maxsum);
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/tigerisland45/p/10204556.html