IT民工
加油!

http://poj.org/problem?id=3620

学长说这道题是广搜题,但是貌似用深搜做更容易,将被淹了的点标记为true,然后

对其上下左右4个点进行深搜,找到相连的最多的点。

/*Accepted    288K    47MS    C++    1080B    2012-07-23 12:20:58*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;

const int MAXN = 105;
const int dx[] = { 1, -1, 0, 0};
const int dy[] = { 0, 0, -1, 1};
bool map[MAXN][MAXN];
int ans, Max;
int N, M, K;

void init()
{
    int x, y;
    memset( map, false, sizeof map);
    while( K --)
    {
        scanf( "%d%d", &x, &y);
        map[x][y] = true;
    }
}

void dfs( int x, int y)
{
    int k, nx, ny;
    if( !map[x][y]) return;
    ans ++;
    map[x][y] = false;
    for( k = 0; k < 4; k ++)
    {
        nx = x + dx[k];
        ny = y + dy[k];
        if( nx >= 1 && nx <= N && ny >= 1 && ny <= M )
            dfs(nx, ny);
    }
}

int main()
{
    int i, j;
    while( scanf( "%d%d%d", &N, &M, &K) != EOF)
    {
        init();
        Max = 0;
        for( i = 1; i <= N; i ++)
            for( j = 1; j <= M; j ++)
            {
                ans = 0;
                dfs(i, j);
                Max = max(ans, Max);
            }
        printf( "%d\n", Max);
    }
    return 0;
}

 



 

posted on 2011-12-13 20:32  找回失去的  阅读(212)  评论(0)    收藏  举报