• 2815:城堡问题


    转载请注明出处:http://www.cnblogs.com/zhishoumuguinian/p/8413547.html

    2815:城堡问题

    总时间限制: 1000ms 内存限制: 65536kB

        1   2   3   4   5   6   7  
       #############################
     1 #   |   #   |   #   |   |   #
       #####---#####---#---#####---#
     2 #   #   |   #   #   #   #   #
       #---#####---#####---#####---#
     3 #   |   |   #   #   #   #   #
       #---#########---#####---#---#
     4 #   #   |   |   |   |   #   #
       #############################
               (图 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
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int a[100][100];//存储房间信息
     5 int color[100][100]={0};//对遍历过的房间进行染色
     6 int numroom=0, maxarea=0;//房间数目和最大房间面积
     7 int  roomarea;//房间面积
     8 void dfs(int x, int y)
     9 {
    10     if(color[x][y]!=0) return;//如果访问过,直接返回
    11     color[x][y]=numroom;//对当前方格染色当前房间编号的色
    12     roomarea++;//如果没访问过,房间面积加一
    13     if((a[x][y]&1)==0) dfs(x,y-1);//西边没墙,向西深搜
    14     if((a[x][y]&2)==0) dfs(x-1,y);//与上个语句相似
    15     if((a[x][y]&4)==0) dfs(x,y+1);
    16     if((a[x][y]&8)==0) dfs(x+1,y);
    17 }
    18 
    19 int main()
    20 {
    21     int n,m;
    22     cin>>n>>m;
    23     for(int i=0; i<n; i++)
    24     {
    25         for(int j=0; j<m; j++)
    26         {
    27             cin>>a[i][j];
    28         }
    29     }//读入房间信息
    30     for(int i=0; i<n; i++)//对所有方格进行遍历
    31     {
    32         for(int j=0; j<m; j++)
    33         {
    34             if(color[i][j]==0)//如果方格没有访问过,那么就是一个新的房间开始
    35             {
    36              numroom++;
    37             roomarea=0;
    38             dfs(i,j);
    39             maxarea=max(maxarea,roomarea);
    40             }
    41         
    42         }
    43     }
    44     cout<<numroom<<endl<<maxarea;
    45 }
  • 相关阅读:
    抽象类和接口的区别
    排序之快速排序(quickSort)
    互联网协议入门(1)
    字符串的操作String
    Java笔试题之SQL语句(单表)
    求职之Java开发所需技能
    【更新完毕啦!】一篇完整的产品体验报告处女作
    阿里2015暑期实习生业务型产品笔试题(附部分参考答案)
    滴滴笔试题(附我的答案)
    【面试】蘑菇街产品运营二面&结果
  • 原文地址:https://www.cnblogs.com/zhishoumuguinian/p/8413547.html
Copyright © 2020-2023  润新知