深搜之城堡问题

城堡
被分割成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
1表示西墙, 2表示北墙, 4表示东墙, 8表
示南墙。每个方块用代表其周围墙的数字之

和表示。

解题思路
 对每一个 方块,深度优先搜索,从而给这个方
块能够到达的所有位置染色。最后统计一共用
了几种颜色,以及每种颜色的数量。
 比如
1 1 2 2 3 3 3
1 1 1 2 3 4 3
1 1 1 5 3 5 3
1 5 5 5 5 5 3
 从而一共有5个房间,最大的房间( 1)占据9

个格子 

算是一道简单的dfs,作为萌新的我还是勉强看别人代码才敲出来的,自己写的话不一定写得出来!!!

#include<iostream》

#include<cstring>
using namespace std;
int r,s;   //行 列
int roomnum; //房间数
int area;
int a[60][60];
int b[60][60];  //标记
int maxarea;
void dfs(int i,int j)
{
    if(b[i][j]!=0)
        return;    //这里用return 0;会报错   因为是void型 没有返回值!!!
    area++;
    b[i][j]=roomnum;
    if((a[i][j]&1)==0)    //向左走    //==运算级大于& 没套括号答案一直不对
        dfs(i,j-1);
    if((a[i][j]&2)==0)    //向上走
        dfs(i-1,j);
    if((a[i][j]&4)==0)   // 向右走
        dfs(i,j+1);
    if((a[i][j]&8)==0)   //向下走
        dfs(i+1,j);
}
int main()
{
    while(cin>>r>>s)
    {
        roomnum=0;
        for(int i=1;i<=r;i++)
        {
            for(int j=1;j<=s;j++)
            {
                cin>>a[i][j];
            }
        }
        memset(b,0,sizeof(b));
        for(int i=1;i<=r;i++)
        {
            for(int j=1;j<=s;j++)
            {
                if(b[i][j]==0)
                {
                    roomnum++;
                    area=0;
                    dfs(i,j);
                    maxarea=max(area,maxarea);
                }
            }
        }
        cout<<roomnum<<endl;           //城堡所有房间数
        cout<<maxarea<<endl;            //最大房间的面积
    }
    return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值