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


相关推荐

  • java volatile关键字的作用_java volatile关键字作用及使用场景详解

    java volatile关键字的作用_java volatile关键字作用及使用场景详解1.volatile关键字的作用:保证了变量的可见性(visibility)。被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。如以下代码片段,isShutDown被置为true后,doWork方法仍有执行。如用volatile修饰isShutDown变量,可避免此问题。publicclassVolatileTest3{staticclassW…

    2022年5月31日
    33
  • 树莓派3B 开箱配置

    树莓派3B 开箱配置概述最近看到淘宝推荐有树莓派3B+,价格和3B一样,增加了千兆网络,和5GWifi,性能也有一些提升,然后就下单买了。可是没看清楚介绍,原来3B+是预售,不是马上有货,然后那家店的3B+是单独预售购买的,如果点了套装,实际上卖的是3B。于是满怀兴奋的拆开快递后,呈现一脸懵B状态。本来纠结要不要退货重买,不过想想其实性能也不是差距十分大,既然都收到了,不如先研究一番,等到19年树莓派4出的时候…

    2022年6月25日
    24
  • strstr函数实现_popen函数

    strstr函数实现_popen函数strstr(str1,str2)函数是用来判断字符串str2,是否为字符串str1的子串,若是子串,则返回第一次出现str2处的地址,若不存在子串,则返回一个空指针。#include<stdio.h>#include<assert.h>#include<string.h>intmain(){ chararr1[]=”abbbcdef”; chararr2[]=”bbc”; char*ret=strstr(arr1,arr2);

    2022年10月15日
    0
  • 一篇读懂无线充电技术(附方案选型及原理分析)「建议收藏」

    一篇读懂无线充电技术(附方案选型及原理分析)「建议收藏」一文读懂无线充电技术(附方案选型及原理分析)0.背景1.无线供电特点2.无线供电原理及实现方式3.现有解决方案分析4.FAQ及相关测试5.参考资料0.背景现今几乎所有的电子设备,如手机,MP3和笔记本电脑等,进行充电的方式主要是有线电能传输,既一端连接交流电源,另一端连接便携式电子设备充电电池的。这种方式有很多不利的地方,首先频繁的插拔很容易损坏主板接口,另外不…

    2022年5月7日
    48
  • Java就业前景和薪资状况,究竟怎么样呢?

    Java就业前景和薪资状况,究竟怎么样呢?在未来5年内,软件人才的需求将远大于供给。Java软件工程师是目前国际高端计算机领域就业薪资较高的一类软件工程师。看到这里有人问了:那Java的现实就业前景和薪资状况,究竟怎么样呢?1、Java工程师就业前景在美国、加拿大、澳大利亚、新加坡等发达国家和中等发达国家,Java软件工程师年薪均在4—15万美金,而在国内,Java软件工程师也有极好的工作机会和很高的薪水。一般情况下的Java软件工程师是分四个等级,从软件技术员到助理软件工程师,再到软件工程师,最后成为高级软件工程师。根据IDC的统计数字,

    2022年7月8日
    25
  • Spark部分流程说明

    Spark部分流程说明

    2021年8月10日
    54

发表回复

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

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