当前位置: 首页 > news >正文

救援启动!

原原老师在一座城市中迷路了。这座城市是一片巨大的迷宫,由n×m的格子组成,每个格子对应迷宫中的一个位置,但城市中有些地方已经变成障碍,任何人只能上下左右移动一格,而障碍则无法通过。

原原老师被困在(sx​,sy​),她计划到警察局求助,警察局在(px​,py​)处。但是原原老师不知道的是,警察局已经搬走了!

然而,事情出现了转机!赵老师得知消息后,马上从(tx​,ty​)处出发赶往救援。赵老师知道原原老师会选择一条最短路径前往警察局。为了成功营救,赵老师计划找到一条最短路径,赶到原原老师即将经过的路径中的任意一点等着她。由于赵老师先出发,因此保证可以在原原老师到达某个位置前赶到这个位置。

在这场营救行动中,“最短路径”有一个特别的定义:原原老师和赵老师会将每一步的移动方向编码成一个数字序列,上代表 1,右代表 2,下代表 3,左代表 4。例如,如果行走方向是上(1)→左(4)→下(3)→右(2),那么路径的编码为1432。在所有可能的路径中,编码数字最小的路径才被视为最短路径。

你能帮助赵老师计算出他最少需要走多少步,才能成功在原原老师的行走路径中截住她?

输入描述

输入共n+1行。

第一行包含八个正整数n,m,sx,sy,tx,ty,px,py。保证原原老师被困位置、城市入口、警察局所处位置互不相同。

接下来共n行,每行m个整数,用来描述城市的俯视图。其中第i行的第j个数表示(i,j)是否被设置障碍,有用 1 表示,没有用 0 表示。

输出描述

输出共一行,表示赵老师最少需要走的步数。

若原原老师没有到达警察局的可行路径,或赵老师没有到达原原老师行走的路径中的任意一点的可行路径,则输出 −1。

步骤:1.利用BFS跑出从(sx,sy)到(px,py)的最短路;

           2.通过前驱标记最短路;

           3.从(tx,ty)开始跑图,若跑到的点被标记,则返回步数。

代码实现:

#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,fx,fy,px,py,a[1010][1010],vis[1010][1010],dir[4][2]={-1,0,0,1,1,0,0,-1},len=1,f,ans=0x3f3f3f;
int ans1[1010][1010];
struct node{int x,y,st;
}q[4000010];
struct node1{int x,y;
}p[1010][1010];
int bfs2(){int hh=0,tt=0;q[tt++]={fx,fy,0};vis[fx][fy]=1;while(hh<tt){node t=q[hh++];if(ans1[t.x][t.y]==1)return t.st;for(int i=0;i<4;i++){int tx=t.x+dir[i][0];int ty=t.y+dir[i][1];if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]&&!a[tx][ty]){vis[tx][ty]=1;q[tt++]={tx,ty,t.st+1};}}}return -1;
} 
void bfs1(){int hh=0,tt=0;q[tt++]={sx,sy,0};p[sx][sy]={sx,sy};vis[sx][sy]=1;while(hh<tt){node t=q[hh++];if(t.x==px&&t.y==py){f=1;break;}for(int i=0;i<4;i++){int tx=t.x+dir[i][0];int ty=t.y+dir[i][1];if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]&&!a[tx][ty]){p[tx][ty]={t.x,t.y};vis[tx][ty]=1;q[tt++]={tx,ty,t.st+1};}}}if(f){ans1[px][py]=1;int xx=px,yy=py;while(xx!=sx||yy!=sy){//cout<<xx<<" "<<yy<<" "<<bfs2(xx,yy)<<" "<<ans<<" "<<endl;ans1[p[xx][yy].x][p[xx][yy].y]=1;int nx=p[xx][yy].x;int ny=p[xx][yy].y;xx=nx,yy=ny;ans1[xx][yy]=1;}ans1[sx][sy]=1;}return;
} 
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m>>sx>>sy>>fx>>fy>>px>>py;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}} bfs1();memset(vis,0,sizeof(vis));ans=bfs2();cout<<ans;
} 

http://www.dtcms.com/a/443254.html

相关文章:

  • Android 事件分发机制 图解
  • 做网站价钱电脑版qq在线登录网页入口
  • 140、【OS】【Nuttx】【周边】效果呈现方案解析:strace 日志解析(六)
  • 免费网站建设软件大全wordpress禁止中国ip
  • 有界区域上具有常数右端项的泊松方程解的上界估计
  • 做区位分析的地图网站wordpress主题分类目录主题
  • 网站建设实习每天内容手机网站开发 html
  • 手机网站制作案例教育网站建设备案
  • 网站开发时的闭包写法进一步加强区门户网站建设管理办法
  • 计算机网站设计怎么做扬中信息网
  • 专业网站名词解释资讯网站 怎样 增强用户粘度
  • 现代C++——并发编程
  • Dotnet通过OpenAI方式接入DeepSeek
  • 第八课(零基础友好版)|第一次训练模型(Teachable Machine,超详细)
  • 定制制作网站公司建筑模型网站有哪些
  • 【多线程】无锁数据结构(Lock-Free Data Structures)是什么?
  • YOLO入门教程(番外):卷积神经网络—卷积神经网络(LeNet)
  • 哪里可以做寄生虫网站wordpress链接默认是什么样子
  • 网站开发常用插件怎样保存网站资料 做证据
  • 网站经常被挂码泉州seo排名扣费
  • 做网站需要做需求分析吗修改wordpress登录背景图片
  • 网站建设人员分布知名的摄影网站有哪些
  • MySQL 运维知识点(十四)---- 主从复制
  • Linux常用通配符大全含运行示例
  • 相城seo网站优化软件django企业级问答网站开发
  • (autode计算化学—atoms)AtomCollection原子集类
  • 主键索引和唯一性索引的区别与联系
  • 免备案域名是危险网站荣耀手机商城官方网
  • 电磁兼容试验标准:电快速脉冲EFT
  • 建立一个平台网站需要多少钱大学软件开发需要学什么