poj2312

poj2312

priority_queue的bfs

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

poj2312
poj2312
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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110368.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • zencart模板列表下载地址

    zencart模板列表下载地址下载index.html文件后用浏览器打开,里面有一百多个zencart模板示例下载地址:zencart模板示例下载地址或者复制下面网址,用浏览器打开即可下载:http://bcs.duapp.com

    2022年7月2日
  • 字符串截取substring方法

    字符串截取substring方法今天截取字符串截取多一个,研究了一下我们吧电话号为字符串开始截取错误示范Stringtel=”159-4322-1515″;intindex=tel.indexOf(“-“);//3intlastIndex=tel.lastIndexOf(“-“);//8Strings=tel.substring(0,index);//159Strings1=tel.substring(index

    2022年5月15日
  • 南大lamda实验室失败面经分享「建议收藏」

    南大lamda实验室失败面经分享「建议收藏」2019年保研基本上尘埃落定,博主最后去了北大信科读研。关于北大的夏令营,把北大往年的夏令营真题刷一刷https://blog.csdn.net/caozixuan98724/article/details/93521208,面试就个凭造化了。值得说的内容不多,反而是最早开始的南大一行,值得说的地方很多,非常有趣,作为我参加的第一个保研面试,跪的一塌糊涂。初审首先先讲lamda实验室的初审…

    2022年4月29日
  • Intellij IDEA 导入 eclipse web 项目详细操作[通俗易懂]

    IntellijIDEA导入eclipseweb项目详细操作第一步:准备工具我用的是IntelliJIDEA2017.1(64)这个版本的,在eclipse中找到我之前写skye_cnmy(非Maven),skye_client(Maven)的项目导入。第二步:在IntellijIDEAFile–&gt;New–&gt;ProjectfromExisting…

    2022年4月15日
  • fastjson -String转JSONArray,JSONArray转List[通俗易懂]

    fastjson -String转JSONArray,JSONArray转List[通俗易懂]String转JsonArrayStringreview=”[{“name”:”人员A”,”review_grades”:{“name”:”优秀”,”parent”:”-1″,”key”:”1″},”remark”:”XXX今年XXX获得优秀党员称号”},{“name”:”人员B”,”review_grades”:{“name”:”合格”,”parent”:”-1″,”key”:”2″},”remark”:”表现良好”},{“name”:”人员C”,”review_grades”:{“name”:”

    2022年6月20日
  • 互联网时代下用户的安全需求_这是一个互联网的时代

    互联网时代下用户的安全需求_这是一个互联网的时代突然意识到这个课题自己也挺感兴趣,而且形势很严峻。

    2022年10月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号