zoukankan      html  css  js  c++  java
  • Sicily 2002. Feeding Time 解题报告

    题目:

    Description

    It's Bessie's feeding time, and Farmer John is trying to decide where to put her. FJ has a farm that comprises W x H (1 <= W <= 750; 1 <= H <= 750) squares and is partitioned into one or more separate pastures by rocks both large and small. Every pasture contains some grass and some rocks.
    Bessie is a hungry little cow and just loves to eat, eat, eat her grass. She can move from any square to any other square that is horizontally, vertically, or diagonally adjacent. Bessie can't cross the rocks because they hurt her feet, and, of course, she can't leave the farm. Bessie wants to know the maximum number of squares of grass that she can eat.
    FJ has a map of his farm, where a '.' represents a square of grass, and a '*' represents a rock. Consider this 10x8 map and a detailed breakdown of the extent of each of its three pastures:

          ...*....**  |  111*....**   ...*2222**    ...*....**
    
          ..**....**  |  11**....**   ..**2222**    ..**....**
    
          ...*....**  |  111*....**   ...*2222**    ...*....**
    
          ...**.*.**  |  111**.*.**   ...**2*2**    ...**.*.**
    
          ***.**.***  |  ***1**.***   ***.**2***    ***.**.***
    
          ...**.*.**  |  111**.*.**   ...**2*2**    ...**.*.**
    
          ...*.*****  |  111*.*****   ...*2*****    ...*.*****
    
          ...***..**  |  111***..**   ...***..**    ...***33**


    Pasture 1 has 21 squares; pasture 2 has 18 squares; pasture 3 has 2 squares. Thus Bessie should choose pasture 1 with 21 squares to maximize the grass she can eat.

    Input

    * Line 1: Two space-separated integers: W and H
    * Lines 2..H+1: Line i+1 describes field row i with W characters (and no spaces), each either '.' or '*'

    Output

    * Line 1: A single integer that represents the maximum number of squares of grass that Bessie can eat.

    Sample Input

    10 8
    ...*....**
    ..**....**
    ...*....**
    ...**.*.**
    ***.**.***
    ...**.*.**
    ...*.*****
    ...***..**

    Sample Output

    21

    纠结了很久的一道题。以前用了一个比较简单的递归实现宽度优先搜索,总是爆栈RUNTIME ERROR,无奈今天上网找了一个用队列的实现,而且改为循环,终于解决了爆栈问题。

    思路也比较简单,将farm以string数组(二维数组)形式读入,然后遍历一遍所有的点,如果是草地的则寻找该点附近连通并且是草地的点。注意查找过的点要置为岩石防止重复。

     1 #include <iostream>
     2 #include <queue>
     3 using namespace std;
     4 
     5 #define MAX 750
     6 
     7 struct Point{
     8     int x,y;
     9     Point(int i,int j){
    10         x=i;
    11         y=j;
    12     }
    13 };
    14 
    15 void findAnArea(int &grass,queue<Point>connection,string farmMap[MAX+2]);
    16 
    17 int main(){
    18     queue<Point>connection;//用来压进某一点开始连通的点
    19     int width,height,max=0,grass;
    20     string farmMap[MAX+2];//加上上下左右4行防止搜寻临近区域时越界
    21     cin>>width>>height;
    22     farmMap[0]=string(width+2,'*'); //地图初始化
    23     farmMap[MAX+1]=string(width+2,'*');
    24     for(int i=1;i<=height;i++){
    25         cin>>farmMap[i];
    26         farmMap[i]="*"+farmMap[i]+"*";
    27     }
    28     for(int i=1;i<=height;i++){
    29         for(int j=1;j<=width;j++){
    30             if(farmMap[i][j]=='.'){
    31                 grass=1;
    32                 farmMap[i][j]='*';//将该点草地置为岩石后搜寻附近的区域
    33                 connection.push(Point(i,j));
    34                 findAnArea(grass,connection,farmMap);
    35                 if(grass>max)
    36                     max=grass;
    37             }
    38         }
    39     }
    40     cout<<max<<endl;
    41     return 0;
    42 }
    43 void findAnArea(int &grass,queue<Point>connection,string farmMap[MAX+2]){
    44     int i,j;
    45     while(!connection.empty()){
    46         i=connection.front().x;
    47         j=connection.front().y;
    48         connection.pop();
    49         if(farmMap[i-1][j-1]=='.'){
    50             farmMap[i-1][j-1]='*';
    51             connection.push(Point(i-1,j-1));
    52             grass++;
    53         }
    54         if(farmMap[i-1][j]=='.'){
    55             farmMap[i-1][j]='*';
    56             connection.push(Point(i-1,j));
    57             grass++;
    58         }
    59         if(farmMap[i-1][j+1]=='.'){
    60             farmMap[i-1][j+1]='*';
    61             connection.push(Point(i-1,j+1));
    62             grass++;
    63         }
    64         if(farmMap[i][j-1]=='.'){
    65             farmMap[i][j-1]='*';
    66             connection.push(Point(i,j-1));
    67             grass++;
    68         }
    69         if(farmMap[i][j+1]=='.'){
    70             farmMap[i][j+1]='*';
    71             connection.push(Point(i,j+1));
    72             grass++;
    73         }
    74         if(farmMap[i+1][j-1]=='.'){
    75             farmMap[i+1][j-1]='*';
    76             connection.push(Point(i+1,j-1));
    77             grass++;
    78         }
    79         if(farmMap[i+1][j]=='.'){
    80             farmMap[i+1][j]='*';
    81             connection.push(Point(i+1,j));
    82             grass++;
    83         }
    84         if(farmMap[i+1][j+1]=='.'){
    85             farmMap[i+1][j+1]='*';
    86             connection.push(Point(i+1,j+1));
    87             grass++;
    88         }
    89     }
    90 }
  • 相关阅读:
    SpringMVC(三) RESTful架构和文件上传下载
    SpringMVC(二) 参数绑定 与 JSON
    SpringMVC(一) 简单代码编写,注解,重定向与转发
    Spring深入浅出(三)XML方式以及注解的方式操作IOC
    Markdown 语法整理
    前端开发中一些好用的chrome插件汇总
    vue-cli项目配置mock数据
    HTTP协议详解
    JS判断IE6/IE7/IE8系列的写法
    ES6新特性(转)
  • 原文地址:https://www.cnblogs.com/jolin123/p/3326186.html
Copyright © 2011-2022 走看看