poj2312

priority_queue的bfs

priority_queue的bfs相当于使用了dijkstra的思想。

View Code
#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <queue>

using namespace std;



#define maxn 305



struct Point

{

    int x, y, w;

}s, t;



int n, m;

char map[maxn][maxn];

bool vis[maxn][maxn];

int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};



bool operator < (const Point &a, const Point &b)

{

    return a.w > b.w;

}



void input()

{

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

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

}



void work()

{

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

        for (int j = 0; j < m; j++)

        {

            if (map[i][j] == 'Y')

            {

                s.x = i;

                s.y = j;

                s.w = 0;

                map[i][j] = 'E';

            }

            if (map[i][j] == 'T')

            {

                t.x = i;

                t.y = j;

                map[i][j] = 'E';

            }

        }

}



bool ok(Point a, int &step)

{

    if (a.x < 0 || a.y < 0 || a.x >= n || a.y >= m)

        return false;

    if (vis[a.x][a.y])

        return false;

    if (map[a.x][a.y] == 'S' ||map[a.x][a.y] == 'R')

        return false;

    if (map[a.x][a.y] == 'E')

    {

        step = 1;

        return true;

    }

    step = 2;

    return true;

}



int bfs()

{

    priority_queue <Point> pq;

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

    pq.push(s);

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

    while (!pq.empty())

    {

        Point u = pq.top();

        pq.pop();

        if (u.x == t.x && u.y == t.y)

            return u.w;

        Point v;

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

        {

            v.x = u.x + dir[i][0];

            v.y = u.y + dir[i][1];

            int step;

            if (ok(v, step))

            {

                v.w = u.w + step;

                pq.push(v);

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

            }

        }

    }

    return -1;

}



int main()

{

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

    while (scanf("%d%d", &n, &m), n | m)

    {

        input();

        work();

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

    }

    return 0;

}

你可能感兴趣的:(poj)