poj1111

bfs

View Code
#include <iostream>

#include <cstdio>

#include <cstring>

#include <cstdlib>

#include <queue>

using namespace std;



#define maxn 30



struct Point

{

    int x, y;

} s;



int n, m;

int dir[8][2] =

{

{ 1, 0 },

{ 0, 1 },

{ -1, 0 },

{ 0, -1 },

{ 1, 1 },

{ -1, 1 },

{ 1, -1 },

{ -1, -1 } };

char map[maxn][maxn];

bool vis[maxn][maxn];



void input()

{

    for (int i = 0; i < n; i++)

        scanf("%s", map[i]);

}



bool in_map(Point &a)

{

    return a.x >= 0 && a.y >= 0 && a.x < n && a.y < m;

}



int cal(Point &a)

{

    int ret = 0;

    for (int i = 0; i < 4; i++)

    {

        Point b = a;

        b.x += dir[i][0];

        b.y += dir[i][1];

        if (!in_map(b) || map[b.x][b.y] == '.')

            ret++;

    }

    return ret;

}



int bfs()

{

    memset(vis, 0, sizeof(vis));

    queue<Point> q;

    q.push(s);

    vis[s.x][s.y] = true;

    int ans = cal(s);

    while (!q.empty())

    {

        Point a = q.front();

        q.pop();

        for (int i = 0; i < 8; i++)

        {

            Point b = a;

            b.x += dir[i][0];

            b.y += dir[i][1];

            if (in_map(b) && map[b.x][b.y] == 'X' && !vis[b.x][b.y])

            {

                q.push(b);

                ans += cal(b);

                vis[b.x][b.y] = true;

            }

        }

    }

    return ans;

}



int main()

{

//    freopen("t.txt", "r", stdin);

    while (scanf("%d%d%d%d", &n, &m, &s.x, &s.y), n | m | s.x | s.y)

    {

        s.x--;

        s.y--;

        input();

        printf("%d\n", bfs());

    }

    return 0;

}

 

你可能感兴趣的:(poj)