zoukankan      html  css  js  c++  java
  • 2815:城堡问题(百练)

    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


    实现代码:
    #include<iostream>
    using namespace std;
    
    int map[60][60];
    int color[60][60]={0};
    int n,m;
    int t=0;
    void dfs(int i,int j,int c);
    int main(){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>map[i][j];
            }
        }
        
        int c=0;    //代表染色号
        int num=0;  //记录房间数量
        int temp=0;     //记录最大房间面积
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(color[i][j]==0){
                    c++;
                    t=0;        //处理
                    dfs(i,j,c);
                    if(temp<t)  temp=t;
                    num++;              //房间数加1
                }
            }
        }
    
        
        cout<<num<<endl;
        cout<<temp;
        return 0;
    }
    
    void dfs(int i,int j,int c){
    
        if(color[i][j]) return;     //必须得加上,因为没有循环终止条件时,容易出现来回搜索生成死循环的情况
        color[i][j]=c;      //代表该块已经走过,给其染色
        t++;
    
        
        //  cout<<i<<" "<<j<<" map:"<<map[i][j]<<" "<<(map[i][j]&1)<<" "<<(map[i][j]&2)<<" "<<(map[i][j]&4)<<" "<<(map[i][j]&8)<<endl;
        //四周搜索下一个可行位置
        if((map[i][j]&1)==0)   dfs(i,j-1,c);
        if((map[i][j]&2)==0)   dfs(i-1,j,c);
        if((map[i][j]&4)==0)   dfs(i,j+1,c);
        if((map[i][j]&8)==0)   dfs(i+1,j,c);
    }
  • 相关阅读:
    [JZOJ3388] 绿豆蛙的归宿

    [JZOJ3464] 秀姿势
    [JZOJ3462] 休息
    [JZOJ3461] 小麦亩产一千八
    [JZOJ3509] 倒霉的小C
    [JZOJ1267] 路障
    CF52C Circular RMQ
    P4162 [SCOI2009]最长距离
    P4047 [JSOI2010]部落划分
  • 原文地址:https://www.cnblogs.com/xwh-blogs/p/13646412.html
Copyright © 2011-2022 走看看