hdu 1728 逃离迷宫(搜索:BFS+优先队列)

2024-06-14 03:18

本文主要是介绍hdu 1728 逃离迷宫(搜索:BFS+优先队列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问在给定转弯次数内能不能到达终点

因为限制了转弯次数,所以要想到每次取转弯次数最小的情况

看了网上好多人都是BFS+DFS,找到某一方向后沿着方向一直走

但我是用优先队列解决,每次取出转弯次数最小的情况,当然这样会慢一些

解决第一次转弯不计次数的方法是判断四个方向是否能加入队列,能的话加入即可

代码如下:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 100
#define LL long long
using namespace std;int m, n;struct Position {int x, y, k, dir;bool operator < (const Position &rhs) const {return k > rhs.k;}
}start, end, cur, tmp;int g[MAXN][MAXN];
bool vis[MAXN][MAXN][12][5];
priority_queue<Position> q;//定义在外面不要忘了清空bool BFS(int k, int x1, int y1, int x2, int y2) {while(!q.empty())q.pop();memset(vis, 0, sizeof(vis));start.x = x1;start.y = y1;start.k = 0;end.x = x2;end.y = y2;end.k = k;cur.k = 0;if(x1-1>=1 && g[x1-1][y1]==0) {//向上cur.x = x1-1;cur.y = y1;cur.dir = 1;q.push(cur);}if(y1-1>=1 && g[x1][y1-1]==0) {//向左cur.x = x1;cur.y = y1-1;cur.dir = 2;q.push(cur);}if(x1+1<=m && g[x1+1][y1]==0) {//向下cur.x = x1+1;cur.y = y1;cur.dir = 4;q.push(cur);}if(y1+1<=n && g[x1][y1+1]==0) {//向右cur.x = x1;cur.y = y1+1;cur.dir = 3;q.push(cur);}while(!q.empty()) {tmp = q.top();q.pop();vis[tmp.x][tmp.y][tmp.k][tmp.dir] = true;if(tmp.x==end.x && tmp.y==end.y) {return true;}if(tmp.x-1>=1 && tmp.dir!=4 && g[tmp.x-1][tmp.y]==0) {//向上cur.x = tmp.x-1;cur.y = tmp.y;cur.dir = 1;cur.k = tmp.k;if(tmp.dir != 1)cur.k++;if(cur.k <= end.k && !vis[cur.x][cur.y][cur.k][cur.dir])q.push(cur);}if(tmp.y-1>=1 && tmp.dir!=3 && g[tmp.x][tmp.y-1]==0) {//向左cur.x = tmp.x;cur.y = tmp.y-1;cur.dir = 2;cur.k = tmp.k;if(tmp.dir != 2)cur.k++;if(cur.k <= end.k && !vis[cur.x][cur.y][cur.k][cur.dir])q.push(cur);}if(tmp.x+1<=m && tmp.dir!=1 && g[tmp.x+1][tmp.y]==0) {//向下cur.x = tmp.x+1;cur.y = tmp.y;cur.dir = 4;cur.k = tmp.k;if(tmp.dir != 4)cur.k++;if(cur.k <= end.k && !vis[cur.x][cur.y][cur.k][cur.dir])q.push(cur);}if(tmp.y+1<=n && tmp.dir!=2 && g[tmp.x][tmp.y+1]==0) {//向右cur.x = tmp.x;cur.y = tmp.y+1;cur.dir = 3;cur.k = tmp.k;if(tmp.dir != 3)cur.k++;if(cur.k <= end.k && !vis[cur.x][cur.y][cur.k][cur.dir])q.push(cur);}}return false;
}int main(void) {int T, k, x1, y1, x2, y2;char ch;scanf("%d", &T);while(T--) {scanf("%d%d", &m, &n);memset(g, 0, sizeof(g));for(int i=1; i<=m; ++i) {getchar();for(int j=1; j<=n; ++j) {ch = getchar();if(ch == '.')g[i][j] = 0;else g[i][j] = -1;}}scanf("%d%d%d%d%d", &k, &y1, &x1, &y2, &x2);if(BFS(k, x1, y1, x2, y2))cout << "yes" << endl;else cout << "no" << endl;}return 0;
}


这篇关于hdu 1728 逃离迷宫(搜索:BFS+优先队列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059225

相关文章

多源 BFS

例题一 解法(bfs)(多个源头的最短路问题) 算法思路: 对于求的最终结果,我们有两种⽅式: • 第⼀种⽅式:从每⼀个 1 开始,然后通过层序遍历找到离它最近的 0 。 这⼀种⽅式,我们会以所有的 1 起点,来⼀次层序遍历,势必会遍历到很多重复的点。并且如果 矩阵中只有⼀个 0 的话,每⼀次层序遍历都要遍历很多层,时间复

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

【数据结构与算法 经典例题】使用队列实现栈(图文详解)

💓 博客主页:倔强的石头的CSDN主页               📝Gitee主页:倔强的石头的gitee主页    ⏩ 文章专栏:《数据结构与算法 经典例题》C语言                                   期待您的关注 ​​ 目录  一、问题描述 二、前置知识 三、解题思路 四、C语言实现代码 🍃队列实现代码:

RabbitMQ实践——临时队列

临时队列是一种自动删除队列。当这个队列被创建后,如果没有消费者监听,则会一直存在,还可以不断向其发布消息。但是一旦的消费者开始监听,然后断开监听后,它就会被自动删除。 新建自动删除队列 我们创建一个名字叫queue.auto.delete的临时队列 绑定 我们直接使用默认交换器,所以不用创建新的交换器,也不用建立绑定关系。 实验 发布消息 我们在后台管理页面的默认交换器下向这个队列

Java并发编程—阻塞队列源码分析

在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了D

剑指offer—编程题7(用两个栈实现一个队列)

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 代码如下: [java]  view plain copy print ? public class Test07 {       /**       * 用两个栈模拟的队列       *

SpringBoot中如何监听两个不同源的RabbitMQ消息队列

spring-boot如何配置监听两个不同的RabbitMQ 由于前段时间在公司开发过程中碰到了一个问题,需要同时监听两个不同的rabbitMq,但是之前没有同时监听两个RabbitMq的情况,因此在同事的帮助下,成功实现了监听多个MQ。下面我给大家一步一步讲解下,也为自己做个笔记; 详细步骤: 1. application.properties 文件配置: u.rabbitmq.ad

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i