POJ 3620-Avoid The Lakes

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;

}

 



 

你可能感兴趣的:(poj)