The Castle
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 6677   Accepted: 3767

Description

     1   2   3   4   5   6   7  

   #############################

 1 #   |   #   |   #   |   |   #

   #####---#####---#---#####---#

 2 #   #   |   #   #   #   #   #

   #---#####---#####---#####---#

 3 #   |   |   #   #   #   #   #

   #---#########---#####---#---#

 4 #   #   |   |   |   |   #   #

   #############################

(Figure 1)

#  = Wall   

|  = No wall

-  = No wall

Figure 1 shows the map of a castle.Write a program that calculates 

1. how many rooms the castle has 

2. how big the largest room is 

The castle is divided into m * n (m<=50, n<=50) square modules. Each such module can have between zero and four walls. 

Input

Your program is to read from standard input. The first line contains the number of modules in the north-south direction and the number of modules in the east-west direction. In the following lines each module is described by a number (0 <= p <= 15). This number
is the sum of: 1 (= wall to the west), 2 (= wall to the north), 4 (= wall to the east), 8 (= wall to the south). Inner walls are defined twice; a wall to the south in module 1,1 is also indicated as a wall to the north in module 2,1. The castle always has
at least two rooms.

Output

Your program is to write to standard output: First the number of rooms, then the area of the largest room (counted in modules).

Sample Input

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

Sample Output

5
9

题意是一个城堡分成了m*n个块,然后给出了每个块一个数字,这个数字代表门的情况,如果这个块西面有门,那么1就要加到这个数字中。如果这个块北面有门,那么2就要加到这个数字中。如果这个块东面有门,那么4就要加到这个数字中。如果这个块南面有门,那么8就加到这个数字中。

所以就可以使用这个数&1 &2 &4 &8来判断哪一个方向有门,连通着的算一个房间,要求的是房间的数量和最大房间的块数。

应该算是深度搜索的模板题了吧。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; int row,col,i,j,sum,result1,result2;
int value[70][70];
int color[70][70]; int move_x[5]={1,0,-1,0};
int move_y[5]={0,1,0,-1}; void dfs(int a,int b)
{
color[a][b]=1;
sum++;
int a_x,b_x; if((value[a][b]&1)==0)
{
a_x=a+move_x[3];
b_x=b+move_y[3];
if(a>=1 && a<=row && b>=1 && b<=col && color[a_x][b_x]==0)
{
dfs(a_x,b_x);
}
}
if((value[a][b]&2)==0)
{
a_x=a+move_x[2];
b_x=b+move_y[2];
if(a>=1 && a<=row && b>=1 && b<=col && color[a_x][b_x]==0)
{
dfs(a_x,b_x);
}
}
if((value[a][b]&4)==0)
{
a_x=a+move_x[1];
b_x=b+move_y[1];
if(a>=1 && a<=row && b>=1 && b<=col && color[a_x][b_x]==0)
{
dfs(a_x,b_x);
}
}
if((value[a][b]&8)==0)
{
a_x=a+move_x[0];
b_x=b+move_y[0];
if(a>=1 && a<=row && b>=1 && b<=col && color[a_x][b_x]==0)
{
dfs(a_x,b_x);
}
} } int main()
{
memset(color,0,sizeof(color)); cin>>row>>col;
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
cin>>value[i][j];
}
}
result1=0;
result2=0;
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
sum=0;
if(color[i][j]==0)
{
dfs(i,j);
result2++;
}
result1=max(sum,result1);
}
} cout<<result2<<endl;
cout<<result1<<endl;
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 1164:The Castle的更多相关文章

  1. [POJ]1164 The Castle

    //markdown复制进来一堆问题 还是链接方便点 POJ 1164 The Castle 首先想到用9个方格来表示一个房间,如此一来复杂许多,MLE代码如下: //Writer:GhostCai ...

  2. POJ 3321:Apple Tree + HDU 3887:Counting Offspring(DFS序+树状数组)

    http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ...

  3. POJ 3252:Round Numbers

    POJ 3252:Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10099 Accepted: 36 ...

  4. OpenJudge 2815 城堡问题 / Poj 1164 The Castle

    1.链接地址: http://bailian.openjudge.cn/practice/2815/ http://poj.org/problem?id=1164 2.题目: 总时间限制: 1000m ...

  5. POJ 1459:Power Network(最大流)

    http://poj.org/problem?id=1459 题意:有np个发电站,nc个消费者,m条边,边有容量限制,发电站有产能上限,消费者有需求上限问最大流量. 思路:S和发电站相连,边权是产能 ...

  6. POJ 3436:ACM Computer Factory(最大流记录路径)

    http://poj.org/problem?id=3436 题意:题意很难懂.给出P N.接下来N行代表N个机器,每一行有2*P+1个数字 第一个数代表容量,第2~P+1个数代表输入,第P+2到2* ...

  7. POJ 2195:Going Home(最小费用最大流)

    http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...

  8. POJ 3281:Dining(最大流)

    http://poj.org/problem?id=3281 题意:有n头牛,f种食物,d种饮料,每头牛有fnum种喜欢的食物,dnum种喜欢的饮料,每种食物如果给一头牛吃了,那么另一个牛就不能吃这种 ...

  9. POJ 1113:Wall

    原文链接:https://www.dreamwings.cn/poj1113/2832.html Wall Time Limit: 1000MS   Memory Limit: 10000K Tota ...

随机推荐

  1. TCP为什么三次握手四次挥手

    TCP概述: 它提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接.因此TCP是一种可靠的的运输服务,也正因为这样,不可避免的增加了许多额外的开销,比如确认,流量控制等.对应的 ...

  2. imple-unpack---攻防世界

    拿到题目查壳没有发现.题目已经明确说了,基本上是有壳的,Linux下面看看 应该就是upx的壳了,下载upx进行脱壳,https://sourceforge.net/projects/upx/file ...

  3. Day5-T4

    原题目 Describe:最小生成树加权 code: #include<bits/stdc++.h> #define INF 214748364 #define eps 1e-9 #def ...

  4. C# log4net相关配置说明

    添加相关文件到工程 链接: https://pan.baidu.com/s/1o83Juo6 密码: inkg 下载附件, 把里的log4net.dll 和 log4net.config 复制到工程目 ...

  5. [前端] Vue封装播放器、打包、上传NPM

    一.使用icomoon 1.生成和下载图标相关文件 先使用icomoon获取我们要使用的图标,例如播放.暂停.停止.全屏等图标. icomoon网站:https://icomoon.io/app/#/ ...

  6. haproxy+keepalive双主高可用实现负载均衡

    转载自https://blog.51cto.com/3381847248/1977073 前面我已经介绍了haproxy结合keepalive做简单的双主高可用,如果不清楚的话,可以去我的上一 篇博客 ...

  7. flutter安装中的一些方法

    1.配置flutter环境变量 进入终端 vim ~/.bash_profile export ANDROID_HOME=~Library/Android/sdk export PATH=$PATH: ...

  8. pyhton pandas数据分析基础入门(一文看懂pandas)

    //2019.07.17 pyhton中pandas数据分析基础入门(一文看懂pandas), 教你迅速入门pandas数据分析模块(后面附有入门完整代码,可以直接拷贝运行,含有详细的代码注释,可以轻 ...

  9. CPU各个具体的指标含义

    CPU各个具体的指标含义解释如下: ①CPU(监测到的master主机上的CPU使用情况) 从图中看出,一共有五个关于CPU的指标.分别如下: 1. User User表示:CPU一共花了多少比例的时 ...

  10. POJ 1458:Common Subsequence

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41957   Accepted: 16 ...