Sicily 2002. Feeding Time

本文介绍了一种使用宽度优先搜索解决农场中特定问题的方法。通过记录已搜索过的点,避免重复搜索,有效解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

宽搜即可解决,注意不要重复搜索,可以用数组记录是否搜索过某一点,也可以特殊标记加以区分。
Run Time: 0.08sec
Run Memory: 1372KB
Code length: 2357Bytes
Submit Time: 2011-12-10 17:14:17

// Problem#: 2002
// Submission#: 1060157
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <string>
#include <queue>
using namespace std;

struct Point {
    int x;
    int y;
    Point( int i, int j ) { x = i; y = j; }
};

int W, H;
string farm[ 752 ];
queue<Point> point;

int eat( int &count ) {
    int x, y;
    while ( !point.empty() ) {
        x = point.front().x;
        y = point.front().y;
        point.pop();
        if ( farm[ x ][ y - 1 ] == '.' ) {
            farm[ x ][ y - 1 ] = '&';
            point.push( Point( x, y - 1 ) );
            count++;
        }
        if ( farm[ x ][ y + 1 ] == '.' ) {
            farm[ x ][ y + 1 ] = '&';
            point.push( Point( x, y + 1 ) );
            count++;
        }
        if ( farm[ x - 1 ][ y ] == '.' ) {
            farm[ x - 1 ][ y ] = '&';
            point.push( Point( x - 1, y ) );
            count++;
        }
        if ( farm[ x + 1 ][ y ] == '.' ) {
            farm[ x + 1 ][ y ] = '&';
            point.push( Point( x + 1, y ) );
            count++;
        }
        if ( farm[ x - 1 ][ y - 1 ] == '.' ) {
            farm[ x - 1 ][ y - 1 ] = '&';
            point.push( Point( x - 1, y - 1 ) );
            count++;
        }
        if ( farm[ x - 1 ][ y + 1 ] == '.' ) {
            farm[ x - 1 ][ y + 1 ] = '&';
            point.push( Point( x - 1, y + 1 ) );
            count++;
        }
        if ( farm[ x + 1 ][ y - 1 ] == '.' ) {
            farm[ x + 1 ][ y - 1 ] = '&';
            point.push( Point( x + 1, y - 1 ) );
            count++;
        }
        if ( farm[ x + 1 ][ y + 1 ] == '.' ) {
            farm[ x + 1 ][ y + 1 ] = '&';
            point.push( Point( x + 1, y + 1 ) );
            count++;
        }
    }

    return count;

}


int main()
{
    int i, j;
    int max, count;

    cin >> W >> H;
    farm[ 0 ] = string( W + 2, ' ' );
    for ( i = 1; i <= H; i++ ) {
        cin >> farm[ i ];
        farm[ i ] = " " + farm[ i ] + " ";
    }
    farm[ H + 1 ] = string( W + 2, ' ' );

    max = 0;
    for ( i = 1; i <= H; i++ ) {
        for ( j = 1; j <= W; j++ ) {
            if ( farm[ i ][ j ] == '.' ) {
                farm[ i ][ j ] = '&';
                point.push( Point( i, j ) );
                count = 1;
                eat( count );
                if ( count > max )
                    max = count;
            }
        }
    }
    cout << max << endl;

    return 0;

}                                 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值