zoukankan      html  css  js  c++  java
  • 搜索8--noi1817:城堡问题

    搜索8--noi1817:城堡问题

    一、心得

    1、这题只是在普通的迷宫的基础上面加上了墙的概念,所以基本的思路和代码就和普通的迷宫是一样的,只不过需要多加上一层墙的判断

    2、这里墙的判断是用的二进制加上位运算的方法

    二、题目

    1817:城堡问题

    总时间限制: 
    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
    
    来源
    1164

    三、分析

    1、这题是DFS而非回溯
    2、因为1表示西墙,2表示北墙,4表示东墙,8表示南墙。如果castle[i][j]&1==1;说明西边有墙不能走

    四、AC代码

     1 /*
     2  * 1817:城堡问题
     3  * 分析:
     4  *
     5  * 1、这题是DFS而非回溯
     6  * 2、因为1表示西墙,2表示北墙,4表示东墙,8表示南墙。如果castle[i][j]&1==1;说明西边有墙不能走
     7  *
     8  */
     9 
    10 
    11 #include <iostream>
    12 using namespace std;
    13 int southNorth, westEast;
    14 int castle[55][55];
    15 int vis[55][55];
    16 int roomNum;
    17 int roomSize;
    18 int maxRoomSize=0;
    19 //1表示西墙,2表示北墙,4表示东墙,8表示南墙
    20 int goSouthNorth[4]={0,-1,0,1};
    21 int goWestEast[4]={-1,0,1,0};
    22 
    23 void init() {
    24     //1、读数据
    25     cin >> southNorth >> westEast;
    26     for (int i = 1; i <= southNorth; i++) {
    27         for (int j = 1; j <= westEast; j++) {
    28             cin >> castle[i][j];
    29             vis[i][j]=false;
    30         }
    31     }
    32     //2、变量初始化
    33     roomNum=0;
    34 
    35 }
    36 
    37 void print() {
    38     cout<< southNorth <<" "<< westEast<<endl;
    39     for (int i = 1; i <= southNorth; i++) {
    40         for (int j = 1; j <= westEast; j++) {
    41             cout<< castle[i][j]<<" ";
    42         }
    43         cout<<endl;
    44     }
    45 }
    46 
    47 void printAns(){
    48     cout<<roomNum<<endl<<maxRoomSize<<endl;
    49 }
    50 //把一个房间所有能访问的格子都给它访问了
    51 void searchAll(int startH,int startW){
    52     for(int i=0;i<4;i++){
    53         //b1为true说明有墙,不能走
    54         bool b1=(1<<i)&castle[startH][startW];
    55         if(!b1){//如果没墙能走
    56             int h1=startH+goSouthNorth[i];
    57             int w1=startW+goWestEast[i];
    58             //b2是不越界
    59             bool b2= h1>=1&&h1<=southNorth&&w1>=1&&w1<=westEast;
    60             if(b2&&!vis[h1][w1]){//如果不越界并且没有被访问过
    61                 vis[h1][w1]=true;
    62                 roomSize++;
    63                 if(roomSize>maxRoomSize) maxRoomSize=roomSize;
    64                 searchAll(h1,w1);
    65             }
    66         }
    67     }
    68 }
    69 
    70 void search(){
    71     for (int i = 1; i <= southNorth; i++) {
    72             for (int j = 1; j <= westEast; j++) {
    73                 roomSize=0;
    74                 if(!vis[i][j]){
    75                     vis[i][j]=true;
    76                     roomNum++;
    77                     roomSize++;
    78                     //cout<<"roomNum:"<<"i="<<i<<" j="<<j<<endl;
    79                     searchAll(i,j);
    80                 }
    81             }
    82         }
    83 }
    84 
    85 int main() {
    86     //freopen("1817in.txt","r",stdin);
    87     init();
    88     //print();
    89     search();
    90     printAns();
    91     return 0;
    92 }

    五、注意点

  • 相关阅读:
    锁(lock)和闩(latch)
    <线程池-定时任务> ScheduledExecutorService之shutdown引发的RejectedExecutionException问题
    get与post需要注意的几点 (转)
    TCP 的那些事儿(上)(转)
    程序员编程艺术:面试和算法心得-(转 July)
    存根类(stub) 是什么意思?有什么作用?(转)
    A writer of dictionaries,a harmless druge.
    第四次作业--项目选题报告(团队)
    第五次作业--原型设计(结对)
    第三次作业--团队展示(团队)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7355632.html
Copyright © 2011-2022 走看看