码迷,mamicode.com
首页 > 其他好文 > 详细

The Castle

时间:2017-10-22 17:31:46      阅读:375      评论:0      收藏:0      [点我收藏+]

标签:const   queue   int   void   ios   end   描述   using   out   

The Castle

链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1250


时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

一座城堡被分成m*n个方块(m≤50,n≤50),每个方块可有0~4堵墙(0表示无墙)。下面示出了建筑平面图:

技术分享

图中的加粗黑线代表墙。几个连通的方块组成房间,房间与房间之间一定是用黑线(墙)隔开的。

现在要求你编一个程序,解决以下2个问题:

1、该城堡中有多少个房间?

2、最大的房间有多大?

 

【输入】

平面图用一个数字表示一个方块(第1个房间用二进制1011表示,0表示无东墙,用十进制11表示)。

第一行一个整数m(m≤50),表示房子南北方向的长度。

第二行一个整数n(n≤50),表示房子东西方向的长度。

后面的m行,每行有n个整数,每个整数都表示平面图对应位置的方块的特征。每个方块中墙的特征由数字P来描述(0≤P≤15)。数字P是下面的可能取的数字之和:

1(西墙 west)

2(北墙 north)

4(东墙 east)

8(南墙 south)

室内的墙被定义两次: 例如方块(1,1)中的南墙也被位于其南面的方块(2,1)定义了一次。

建筑中至少有两个房间。

 

【输出】

第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
题解:mp[i][j][0]记录是第几个房间,mp[i][j][1..4]记录该方向是否有障碍
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,ans;
int mp[255][255][6];
struct node{
    int x,y;
    node():x(),y(){}
    node(const int x,const int y):x(x),y(y){}
};
int zl[5][2]={{0},{0,-1},{-1,0},{0,1},{1,0}};
int a[5]={0,1,2,4,8};
void bfs(int x,int y,int t)
{
    queue <node>Q;
    Q.push(node(x,y));
    ans++;
    mp[x][y][0]=t;
    while(!Q.empty())
    {
        node nw=Q.front();
        Q.pop();
        for(int i=1;i<=4;i++)
        {
            int x1=nw.x+zl[i][0],yy1=nw.y+zl[i][1];
            if(x1>0&&x1<=m&&yy1>0&&yy1<=n&&!mp[nw.x][nw.y][i]&&!mp[x1][yy1][0])
            {
                mp[x1][yy1][0]=t;
                Q.push(node(x1,yy1));
                ans++;
            }
        }
    }
    
}
int main()
{

    cin>>m>>n;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
        {
            int p;
            cin>>p;
            for(int k=4;k>0;k--)
                if(p-a[k]>=0)
                {
                    p-=a[k];
                    mp[i][j][k]=1;
                }
        }
    int t=1,maxn=0;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
        if(!mp[i][j][0])
        {
            bfs(i,j,t++);
            maxn=max(maxn,ans);
            ans=0;
        }
    
    cout<<t-1<<endl<<maxn<<endl;
}

 


The Castle

标签:const   queue   int   void   ios   end   描述   using   out   

原文地址:http://www.cnblogs.com/EdSheeran/p/7709807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!