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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android bindservice方法,android BindService[通俗易懂]

    android bindservice方法,android BindService[通俗易懂]1、绑定服务1.1绑定方式通过服务链接(ServiceConnection)或直接获取Service中状态和数据信息服务链接能够获取Service的对象,因此绑定Service的组件可以调用Service中的实现的函数使用Service的组件通过Context.bindService()建立服务链接,通过Context.unbindService()停止服务链接如果在绑定过程中Service没有启…

    2022年5月1日
    192
  • 查看linux内核版本号的方法_查看系统型号命令

    查看linux内核版本号的方法_查看系统型号命令小编给大家分享一下关于查看Linux系统版本、内核版本、查看Linux的IP地址以及Terminal终端最常用到的几个命令符:一、查看Linux系统版本(cat/etc/issue或者lsb_release-a)二、查看Linux内核版本命令(cat/proc/version或者uname-a)三、查看Linux的IP地址:四、常用命令:1、tab键命令补全2、cle…

    2022年10月10日
    2
  • tcp rst报文_TCP报文格式

    tcp rst报文_TCP报文格式RESET报文的接收和检查处理。客户端握手阶段对于TCP客户端,在发送完SYN报文之后,如果接收到的回复报文同时设置了ACK和RST标志,在检查完ACK的合法性之后,处理RST标志,关闭套接口。对于ACK确认序号,其应当大于第一个未确认序号(snd_una),并且,确认序号不应大于未发送数据的序号(snd_nxt)。通常情况下ACK确认序号应当等于snd_una加一(SYN占用一个序号),但是,如果SYN报文中带有数据(例如:TFO),ACK确认序号会更大。以上情况向对端发送reset报文,但是,如果

    2022年10月1日
    2
  • 最全的ASP.NET开源CMS汇总[通俗易懂]

    最全的ASP.NET开源CMS汇总[通俗易懂]这里汇总了一些asp.net开源cms,希望对学习ASP.NET的人员带来帮助.  国内:1.SiteServerCMSSiteServerCMS网站内容管理系统(著作权登记号2008SR15710)是定位于中高端市场的CMS内容管理系统,能最近汇总了一些asp.net开源cms,希望对学习ASP.NET的人员带来帮助:  国内CMS:  1.SiteServerCMS

    2022年9月1日
    3
  • kali linux暴力破解wifi密码

    前期需要将kali安装好,并且有无线网卡(注意kali支持芯片为3070和1887L的网卡)打开kali,打开终端,使用命令ifconfig查看网卡信息,若有wlan0表示网卡连接成功![在这里插入图片描述](https://img-blog.csdnimg.cn/20200530193911516.png开启网卡监听模式airmon-ngstartwlan0iwconfig,网卡名为wlan0mon,说明开启成功airodump-ngwlan0mon扫描WiFi,按

    2022年4月13日
    80
  • KindEditor是一套很方便的html编译器插件

    KindEditor是一套很方便的html编译器插件

    2021年11月5日
    55

发表回复

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

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