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 }
  • 相关阅读:
    文件操作函数
    sublime text2 常用快捷键
    过滤掉字段为空的数据
    PHP安装memcache扩展接口步骤
    大数据的逻辑,其实是中医的逻辑
    大数据的逻辑,其实是中医的逻辑
    SPSS输出结果如何在word中设置小数点前面显示加0
    SPSS输出结果如何在word中设置小数点前面显示加0
    掌握4个有效的数据分析要点,切实解决用户痛点
    掌握4个有效的数据分析要点,切实解决用户痛点
  • 原文地址:https://www.cnblogs.com/jolin123/p/3326186.html
Copyright © 2011-2022 走看看