BFS解决POJ 2386

Description

Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.

Given a diagram of Farmer John's field, determine how many ponds he has.

Input

* Line 1: Two space-separated integers: N and M

* Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.

Output

* Line 1: The number of ponds in Farmer John's field.

Sample Input

10 12

W........WW.

.WWW.....WWW

....WW...WW.

.........WW.

.........W..

..W......W..

.W.W.....WW.

W.W.W.....W.

.W.W......W.

..W.......W.

Sample Output

3
 
   
View Code
#include "iostream"

#include "string"

using namespace std;

int used[105][105];

char map[105][105];

int direction[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};

struct point

{

    int x;

    int y;

}queue[10005];

int si, sj, iColumn, iRow, count;

void bfs()

{

    int head = 0, tail = 0;

    used[si][sj] = 1;

    queue[head].x = si;  //搜索的初始x坐标

    queue[head].y = sj;  //搜索的初始y坐标

    head++;

    while(tail<head)

    {

        point temp1 = queue[tail];

        tail++;

        int k, m;

        for(k=0; k<8; k++)

        {

            point temp2;

            temp2.x = temp1.x+direction[k][0];  

            temp2.y = temp1.y+direction[k][1]; 

            if(temp2.x>=0 && temp2.x<iRow && temp2.y>=0 && temp2.y<iColumn && !used[temp2.x][temp2.y] && map[temp2.x][temp2.y]=='W')

            {

                used[temp2.x][temp2.y] = 1;

                queue[head] = temp2;

                head++;

            }

        }

    }

}

int main()

{

    int i, j;

    while(cin>>iRow>>iColumn)

    {

        memset(used, 0, sizeof(used));

        count=0;

        for(i=0; i<iRow; i++)

            for(j=0; j<iColumn; j++)

                cin>>map[i][j];

             for(i=0; i<iRow; i++)

            for(j=0; j<iColumn; j++)

            {

                if(map[i][j]=='W' && used[i][j]==0)  //一旦遇到了W,并且没有被访问过就bfs(),count++;

                {

                    si = i;

                    sj = j;

                    bfs();

                    count++;

                }

            }

        cout<<count<<endl;

    }

    return 0;

}

 

 
   
 

你可能感兴趣的:(poj)