迷宫问题三种种解法(A*算法+BFS+双向广搜)

题目描述

小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。

输入格式

输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。

输出格式

对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。

样例输入

1
5 5
S-###
-----
##---
E#---
---##

样例输出

一、A*算法 

#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
#include<unordered_map>
#define x first
#define y second
using namespace std;
const int N=105;
char a[N][N];
int n,m,dist[N][N],sx,sy,ex,ey;
bool st[N][N];
typedef pair<int,int> PII;
typedef pair<int,PII> PIII;
typedef pair<int,PIII> PIIII;
int ne[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void Dijkstra()
{memset(st,false,sizeof st);priority_queue<PIII,vector<PIII>,greater<PIII>> heap;heap.push({0,{ex,ey}});memset(dist,0x3f,sizeof dist);dist[ex][ey]=0;while(heap.size()){auto it=heap.top();heap.pop();int xx=it.y.x,yy=it.y.y,distance=it.x;if(st[xx][yy]) continue;st[xx][yy]=true;for(int i=0;i<=3;i++){int tx=xx+ne[i][0],ty=yy+ne[i][1];if(!st[tx][ty]&&tx>=0&&tx<n&&ty>=0&&ty<m&&a[tx][ty]!='#'){if(dist[tx][ty]>distance+1){dist[tx][ty]=distance+1;heap.push({dist[tx][ty],{tx,ty}});}}}}
}
int astar()
{if(dist[sx][sy]==0x3f3f3f3f) return -1;priority_queue<PIIII,vector<PIIII>,greater<PIIII>> heap;heap.push({dist[sx][sy],{0,{sx,sy}}});memset(st,false,sizeof st);while(heap.size()){auto it=heap.top();heap.pop();int distance=it.y.x,xx=it.y.y.x,yy=it.y.y.y;if(xx==ex&&yy==ey) return distance;if(st[xx][yy]) continue;st[xx][yy]=true;for(int i=0;i<=3;i++){int tx=ne[i][0]+xx,ty=yy+ne[i][1];if(a[tx][ty]=='#') continue;if(!st[tx][ty]&&tx>=0&&tx<n&&ty>=0&&ty<m){heap.push({distance+1+dist[tx][ty],{distance+1,{tx,ty}}});}}}return -1;
}
int main()
{int t;cin>>t;while(t--){cin>>n>>m;memset(a,'\0',sizeof a);for(int i=0;i<n;i++)for(int j=0;j<m;j++){cin>>a[i][j];if(a[i][j]=='S') sx=i,sy=j;if(a[i][j]=='E') ex=i,ey=j;}Dijkstra();cout<<astar()<<endl;}
}

二、BFSDFS省略不写,不是因为我太懒才不想写)

#include<iostream>
#include<cstring>
#include<queue>
#include<cstdlib>
using namespace std;
const int N=105;
typedef pair<int,int> PII;
char a[N][N];
int t,n,m,sx,sy,ex,ey;
int dist[N][N];
bool st[N][N];
int ne[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int BFS()
{queue<PII> q;q.push({sx,sy});memset(dist,0x3f,sizeof dist);memset(st,false,sizeof st);dist[sx][sy]=0;st[sx][sy]=true;while(q.size()){auto it=q.front();q.pop();int x=it.first,y=it.second;if(x==ex&&y==ey) return dist[x][y];for(int i=0;i<=3;i++){int tx=x+ne[i][0],ty=y+ne[i][1];if(tx>=0&&tx<n&&ty>=0&&ty<m&&a[tx][ty]!='#'&&!st[tx][ty]){dist[tx][ty]=dist[x][y]+1;q.push({tx,ty});st[tx][ty]=true;}}}return -1;
}
int main()
{cin>>t;while(t--){cin>>n>>m;memset(a,'\0',sizeof a);for(int i=0;i<n;i++)for(int j=0;j<m;j++){cin>>a[i][j];if(a[i][j]=='S')sx=i,sy=j;if(a[i][j]=='E')ex=i,ey=j;}cout<<BFS()<<endl;}}

三、双向广搜

#include<iostream>
#include<queue>
#include<cstring>
#include<unordered_map>
using namespace std;
const int N=105;
typedef pair<int,int> PII;
int da[N][N],db[N][N],n,m,t,sx,sy,ex,ey;
char a[N][N];
int ne[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int extend(queue<PII> &q,int da[][N],int db[][N])
{auto it=q.front();q.pop();int x=it.first,y=it.second;for(int i=0;i<=3;i++){int tx=x+ne[i][0],ty=y+ne[i][1];if(tx>=0&&tx<n&&ty>=0&&ty<m&&a[tx][ty]!='#'&&da[tx][ty]==-1){if(db[tx][ty]!=-1) return da[x][y]+db[tx][ty]+1;da[tx][ty]=da[x][y]+1;q.push({tx,ty});}}return -1;
}
int BFS()
{queue<PII> qa,qb;qa.push({sx,sy});qb.push({ex,ey});memset(da,-1,sizeof da);memset(db,-1,sizeof db);da[sx][sy]=0;db[ex][ey]=0;while(qa.size()&&qb.size()){int t;if(qa.size()<=qb.size()) t=extend(qa,da,db);else t=extend(qb,db,da);if(t!=-1) return t;}return -1;
}
int main()
{cin>>t;while(t--){cin>>n>>m;memset(a,'\0',sizeof a);for(int i=0;i<n;i++)for(int j=0;j<m;j++){cin>>a[i][j];if(a[i][j]=='S') sx=i,sy=j;if(a[i][j]=='E') ex=i,ey=j;}cout<<BFS()<<endl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】升级打怪之路 Day 24:回溯算法的解题框架

今日题目&#xff1a; 46. 全排列51. N 皇后78. 子集 目录 LC 46. 全排列LC 51. N 皇后LC 78. 子集 【classic】1&#xff09;思路一2&#xff09;思路二 今天学习了回溯算法的解题框架&#xff1a;回溯算法解题套路框架 | labuladong 回溯算法的整体框架都是&#xff1a; re…

力扣L11--- 344.反转字符串(JAVA版)-2024年3月15日

1.题目 2.知识点 交换两个变量值的代码 char temps[left];//temp为暂时的变量&#xff0c;left是左指针&#xff0c;将left暂时存储在temp里面s[left]s[right];//将右指针的值赋给左指针s[right]temp;//将temp的值给右指针left;//左指针向左移动right--;//右指针向右移动3.代码…

Nginx高级技术: 地址重写 Rewrite和应用场景

一、rewrite 场景示例说明 1、基于客户端指定 IP 访问跳转 应用场景说明&#xff1a;指定的 IP地址能正常访问192.168.179.10访问正常。 Rewrite配置如下&#xff1a; vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name www.old.com; …

【嵌入式DIY实例】-最大功率点跟踪 (MPPT) 太阳能充电控制器

最大功率点跟踪 (MPPT) 太阳能充电控制器 文章目录 最大功率点跟踪 (MPPT) 太阳能充电控制器1、应用介绍2、硬件准备3、太阳能充电控制器介绍4、硬件设计5、驱动代码实现1、应用介绍 在这个应用中,我们将使用 Arduino 并结合许多主动-被动电子设备构建我们自己的 MPPT 太阳能…

2024年【广东省安全员C证第四批(专职安全生产管理人员)】考试总结及广东省安全员C证第四批(专职安全生产管理人员)模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;考试总结是安全生产模拟考试一点通总题库中生成的一套广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;模拟试题&#xff0c;…

【ShenYu源码阅读】支持提醒通知设计,来看看开源贡献者都做了什么

相信大家碰到源码时经常无从下手&#x1f643;&#xff0c;不知道从哪开始阅读&#xff0c;面对大量代码晕头转向&#xff0c;索性就读不下去了&#xff0c;又浪费了一次提升自己的机会&#x1f62d;。 我认为有一种方法&#xff0c;可以解决大家的困扰&#xff01;那就是通过阅…

修复ElementUI中el-select与el-option无法通过v-model实现数据双向绑定的问题

1. 问题描述 需求&#xff1a;在使用ElementUI时&#xff0c;通过el-select和el-option标签实现下拉列表功能&#xff0c;当el-option中的选项被选中时&#xff0c;被选中的选项可以正确回显到已选择的列表中。 对于上面的下拉列表&#xff0c;当我们选中“超级管理员”的选项…

跨境电商应该用什么样的服务器?多大带宽?

跨境电商在选择服务器 和带宽时&#xff0c;需要考虑多个因素&#xff0c;包括业务规模、用户数量、网站流量、地理位置等。下面是一些关键考虑因素&#xff1a; 1、服务器类型 跨境电商通常会选择使用云服务器&#xff0c;因为云服务器具有灵活性、可扩展性和高可用性。云服务…

中国人民银行修订发布《征信投诉办理规程》

近年来&#xff0c;我国征信市场快速发展,征信业务覆盖主体持续增多、征信服务应用场景日益多元&#xff0c;征信权益保护工作面临新形势新任务。为更好地保障信息主体合法权益&#xff0c;推动我国征信业高质量发展&#xff0c;近日&#xff0c;中国人民银行修订发布《征信投诉…

算法训练营day48,动态规划16

package main func max(a, b int) int { if a > b { return a } return b } //647. 回文子串 func countSubstrings(s string) int { n : len(s) dp : make([][]bool, n) for i : 0; i < n; i { dp[i] make([]bool, n) } num : 0 for i : n - 1; i > 0; i-- { for…

SpringBoot原理解析

目录 依赖管理父项目依赖starter场景启动器 自动配置 Bean 和Component 的区别&#xff1a; 容器功能注解 简化开发web场景开发请求处理响应请求 thymeleaf视图解析原理流程 HandlerInterceptor拦截器文件上传异常处理错误处理默认规则定制错误处理逻辑异常处理自动配置异常处理…

微信分销商城小程序开发定制价格解析

在互联网时代&#xff0c;电子商务的飞速发展使得微信分销商城小程序成为消费者购物体验的一大利器&#xff0c;同时也为企业带来了更多的商业机遇。那么&#xff0c;微信分销商城小程序开发定制的价格究竟是多少呢&#xff1f;这个问题需要从多个方面来加以考虑。首先&#xf…

代码随想录|Day20|二叉树09|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 思路&#xff1a;利用二叉搜索树的性质&#xff0c;对于每个节点&#xff0c;判断其是否在区间内&#xff1a; 如果节点值 < low&#xff0c;则此节点和其左子树都不在范围内如果节点值 > high&#xff0c;则此节点和其右子树都不在范围内如果 low &…

MySQL 相关英文单词

1、database[deɪtəbeɪs] n. 数据库&#xff0c;资料库 2、net[net] 网络 3、start[stɑ:t] vt. 开始&#xff1b;启动 4、stop[stɒp] vi. 停止&#xff1b;中止&#xff1b;n. 停止&#xff1b;车站 5、root[ru:t] 根&#xff0c;MySQL 的超级管理员的用户名 6、…

鸿蒙视频播放的实现

文章目录 前言播放效果视频播放的实现总结 一、前言 现在市面上很多应用都跟视频有关&#xff0c;那么在鸿蒙系统上怎么来播放视频呢&#xff0c;今天就讲解视频播放控件&#xff0c;让你也能快速地进行视频播放功能开发。 最后呢&#xff0c;我会提供一个鸿蒙中涉及的主要…

2024年华为OD机试真题-任务处理-Java-OD统一考试(C卷)

题目描述: 在某个项目中有多个任务(用 tasks 数组表示)需要您进行处理,其中 tasks[i] = [si, ei],你可以在 si <= day <= ei 中的任意一天处理该任务。请返回你可以处理的最大任务数。 注:一天可以完成一个任务的处理。 输入描述: 第一行为任务数量 n,1 <= n …

二刷代码随想录——动态规划day47

文章目录 前言动态规知识点 动规五部曲一、198. 打家劫舍二、213. 打家劫舍 II三、337. 打家劫舍 III总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0c;于是参加了卡子…

元函数与运行期(普通)函数的区别,为什么要用元函数?

看以下面代码你就知道了&#xff1a; /// <summary> /// 求整数所对应的二进制表示中1的个数 /// </summary> /// <typeparam name"Input"></typeparam> /// 创建时间&#xff1a;2024-01-24 抄自&#xff1a;《动手打造深度学习框架》 21…

深度学习模型部署(十)模型部署配套工具二

上篇blog讲了trtexec和onnx_graphsurgeon两个工具&#xff0c;一个用于将onnx转化为trt模型&#xff0c;另一个用于对onnx模型进行修改。这篇blog讲polygraphy和nsight systems&#xff0c;前者用于进行模型优化以及结果验证&#xff0c;后者用于性能分析。 polygraph polygra…

️ 亲身体验!探索工业界最前沿的安全帽数据集,你的工作安全靠它保驾护航!

一、SHWD安全帽佩戴检测数据集&#xff08;Safety helmet (hardhat) wearing detect dataset&#xff09; 介绍 SHWD 提供了用于安全头盔佩戴和人头检测的数据集。它包括7581张图像&#xff0c;其中9044个人体安全头盔佩戴对象&#xff08;正面&#xff09;和111514个正常头部…