宽搜即可解决,注意不要重复搜索,可以用数组记录是否搜索过某一点,也可以特殊标记加以区分。
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;
}