您的位置:首页 > 运维架构

NoiOpenJudge 2.5 城堡问题

2016-12-09 22:09 591 查看
总时间限制: 1000ms 内存限制: 65536kB

描述

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

#include <iostream>
#include <memory.h>
using namespace std;
int a[1005][1005],n,m,room,block,maxblock,dx[8]={2,0,-2,0},dy[8]={0,2,0,-2};
void dfs(int x,int y)
{
int i,tx,ty;
for(i=0;i<=7;i++)
{
tx=x+dx[i];
ty=y+dy[i];
if (tx>0&&tx<=2*n&&ty>0&&ty<=2*m&&a[tx][ty]==0&&a[x+dx[i]/2][y+dy[i]/2]==0)
{
block++;
a[tx][ty]=1;
a[x+dx[i]/2][y+dy[i]/2]=1;
dfs(tx,ty);
}
}
}
int main()
{
int i,k,j;
cin>>n>>m;
memset(a,0,sizeof(a));
for(i=0;i<=2*n;i++)
{
a[i][0]=1;
a[i][2*m]=1;
}
for(i=0;i<=2*m;i++)
{
a[0][i]=1;
a[2*n][i]=1;
}
for(i=1;i<=2*n;i=i+2)
for(j=1;j<=2*m;j=j+2)
{
cin>>k;
if(k>=8)
{
a[i+1][j]=1;
k-=8;
}
if(k>=4)
{
a[i][j+1]=1;
k-=4;
}
if(k>=2)
{
a[i-1][j]=1;
k-=2;
}
if(k>=1)
a[i][j-1]=1;
}
for(i=1;i<=2*n;i=i+2)
for(j=1;j<=2*m;j=j+2)
if(a[i][j]==0)
{
block=1;
room++;
a[i][j]=1;
dfs(i,j);
if(block>maxblock)maxblock=block;
}
cout<<room<<endl<<maxblock<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++