迷宫问题三种种解法(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.代码…

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;微信分销商城小程序开发定制的价格究竟是多少呢&#xff1f;这个问题需要从多个方面来加以考虑。首先&#xf…

鸿蒙视频播放的实现

文章目录 前言播放效果视频播放的实现总结 一、前言 现在市面上很多应用都跟视频有关&#xff0c;那么在鸿蒙系统上怎么来播放视频呢&#xff0c;今天就讲解视频播放控件&#xff0c;让你也能快速地进行视频播放功能开发。 最后呢&#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个正常头部…

渐开线花键不是齿轮?

在和一位小伙伴交流时&#xff0c;他认为齿轮和花键不一样&#xff0c;那花键是不是齿轮呢&#xff1f;老师傅们可以绕开了&#xff0c;我觉得对于一些平时接刚刚接触齿轮&#xff0c;或者很少接触的朋友来说&#xff0c;还是有必要聊一聊这个话题。 首先这个问题并不严谨&…

DeePhage:预测噬菌体的生活方式

GitHub - shufangwu/DeePhage: A tool for distinguish temperate phage-derived and virulent phage-derived sequence in metavirome data using deep learning 安装 conda create -n deephage conda activate deephage pip install numpy pip install h5py pip install ten…

Spring Security入门教程:利用Spring Security实现安全控制

在现今这个数码大展拳脚的时代&#xff0c;安全问题无疑是咱们这些搞软件开发的人需要谨慎应对的一块烫手山芋&#xff0c;无论是那些大型企业应用&#xff0c;还是那种小打小闹的个人项目&#xff0c;对我们宝贵的数据和服务的保护都显得尤为关键。 试想一下&#xff0c;若是…

Java代码基础算法练习-求数据序列的最大值及最小值---2024.3.15

题目 任务描述&#xff1a;输入n个整数&#xff0c;求n个整数的最大值及最小值&#xff0c;并输出相应的位置序号。&#xff08;注&#xff1a;n<10&#xff0c; 位置序号从1开始计算&#xff0c;若存在多个相同值的情形&#xff0c;则输出第1个值的序号&#xff09; 任务要…

PTA题解 --- 求整数段和(C语言)

今天是PTA题库解法讲解的第二天&#xff0c;接下来讲解求整数段和&#xff0c;题目如下&#xff1a; 为了解决这个问题&#xff0c;你可以遵循以下的思路&#xff1a; 1. 读取输入的两个整数A和B。 2. 使用一个for循环&#xff0c;从A遍历到B。 3. 在循环中&#xff0c;打印当…

试卷上的水印如何去除?分享3种常用的方法!

在日常生活和工作中&#xff0c;我们经常会遇到一些带有水印的试卷或文档&#xff0c;这些水印不仅影响了我们的阅读体验&#xff0c;还可能对我们的工作和学习产生一定的困扰。那么&#xff0c;如何有效去除试卷上的水印呢&#xff1f;今天&#xff0c;就让我们一起来探讨这个…

渗透测试实战思路分析

免责声明&#xff1a;文章来源真实渗透测试&#xff0c;已获得授权&#xff0c;且关键信息已经打码处理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人…

Liunx下安装Redis(详细安装)

1、创建一个文件目录 mkdir /opt/redis2、进入安装目录 cd /opt/redis3、下载redis默认安装包 默认是3.0版本的 wget http://download.redis.io/releases/redis4、进行解压 tar -xzvf redis-3.0.7.tar.gz5、进入解压好的文件夹目录 cd redis-3.0.7 6、将redis重新安装到 …