深度优先搜索之入门问题->城堡问题

来源:互联网 发布:java分布式开发技术 编辑:程序博客网 时间:2024/04/30 13:23

转载:北京大学暑期课 ACM/ICPC竞赛训练

题目描述

编写一个程序,计算城堡一共有多少个房间,最大的房间有多大.城堡被分割成m*n(m<=50,n<=50)个方块,每个方块可以有0~4面墙.

输入

1) 程序从标准输入设备读入数据
2) 在第一行是两个整数,分别是南北向,东西向的 方块数
3)接下来的输入行中,每个方块用一个数字(0<=p<=50)描述.每个方块用代表其周围墙的数字之和表示.墙使用一个数字表示: 1表示西墙,2表示北墙,4表示东墙,8表示南墙.
4)输入的数据保证城堡至少有两个房间

输出

1)城堡的房间数,城堡中最大房间所包括的方块数
2)结果显示在标准输出设备上

输入样例
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

解题思路

对于每个房间,深度优先搜索,从而给这个房间能够到达的所有位置染色.最后统计一共用了几种颜色,以及每种颜色的数量.

具体理解详细看代码

代码详解

#include <iostream>#include <cstring>#include <stack>using namespace std;int R, C;   //城堡的长和宽int room[50][50];   //房间数量int color[50][50];  //判断是否染色(判重)int roomNum = 0;        //房间数int roomArea = 0;       //房间的方块数int roomAreaMax = 0;    //最大房间方块数void castle_dfs(int i, int j){    if (color[i][j]) return;    ++roomArea;    color[i][j] = roomNum;    if ((room[i][j] & 1) == 0) castle_dfs(i, j - 1);    //向西走    if ((room[i][j] & 2) == 0) castle_dfs(i - 1, j);    //向北走    if ((room[i][j] & 4) == 0) castle_dfs(i, j + 1);    //向东走    if ((room[i][j] & 8) == 0) castle_dfs(i + 1, j);    //向南走    /**************************************    1.因为1,2,4,8的二进制0001,0010,0100,1000分别表示四种属性    2.使用&来检测属性,然后判断方向    ***************************************/}void max_area(int roomArea, int &roomAreaMax){    if (roomArea > roomAreaMax) roomAreaMax = roomArea;}int main(){    //输入部分    cin >> R >> C;  //输入长宽    for (int i = 1; i <= R; i++)    {        for (int j = 1; j <= C; j++)        {            cin >> room[i][j];  //方块号        }    }    //计算部分    for (int i = 1; i <= R; i++)    {        for (int j = 1; j <= C; j++)        {            roomArea = 0;   //需要初始化            if (!color[i][j])            {                ++roomNum;  //房间数加1                castle_dfs(i, j);                max_area(roomArea, roomAreaMax);            }        }    }    cout << roomNum << endl;    cout << roomAreaMax << endl;    return 0;}
原创粉丝点击