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

【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(13)

目录

写在前面:

题目:P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

        题目描述:

        输入格式:

        输出格式:

        输入样例:

        输出样例:

解题思路:

代码:

AC !!!!!!!!!!

写在最后:


写在前面:

怎么样才能学好一个算法?

我个人认为,系统性的刷题尤为重要,

所以,为了学好广度优先搜索,为了用好搜索应对蓝桥杯,

事不宜迟,我们即刻开始刷题!

题目:P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述:

输入格式:

输入只有一行四个整数,分别为n, m, x, y。

输出格式:

一个 n × m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1)。

输入样例:

3 3 1 1

输出样例:


输出 #1复制
0    3    2    
3    -1   1    
2    1    4   

解题思路:

我们根据这道题的数据范围,可以判断出,

这道题需要使用广度优先搜索,题目要求是,

找出马到一个点最少需要几步,

我们用bfs,一层层搜索他的情况即可,

那么我们先来模拟一下题目给出的用例:

这个是我们的起点:

 在象棋中,马走日字,在这个矩阵中,

它有两个位置可以走:

所以那两个位置被置为1,

表明马已经走了一步,

我们让马继续走:

马有走到这些位置,

继续记录路径和:

 马继续走,以此类推,最后就会走到目标点位:

 

 我们根据上面的规律实现代码,

但是这一次,我打算换一种方式,

因为调用STL库中的队列速度是比较慢的,

我们可以自己用数组模拟一个队列,

这样可以加快效率,

我们应该怎么实现呢?

我们可以用头尾两个指针维护这个队列,

往队列插入一个数:

 如果要出队,那就让队头++,

这样就访问不了那个数了:

如果要入队,

就让队尾 tail++,再q[tail] = x。

如果队头大于队尾,那就证明队列为空:

  

下面是代码实现:

代码:

//包好头文件
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;int n, m, x, y;const int N = 500;//存坐标
typedef pair<int, int> PII;//存马的步数
int dist[N][N];//用数组模拟队列
PII q[N * N];//存坐标偏移量
int dx[] = {2, 2, 1, 1, -1, -1, -2, -2};
int dy[] = {1, -1, 2, -2, 2, -2, 1, -1};void bfs(int x, int y)
{//初始化memset(dist, -1, sizeof(dist));//插入第一个数据q[0] = {x, y};dist[x][y] = 0;int head = 0;int tail = 0;//如果头指针大于尾指针,证明队列为空while(head <= tail){auto t = q[head];head++;for(int i = 0; i < 8; i++){int a = dx[i] + t.first;int b = dy[i] + t.second;//控边界if(a < 1 || a > n || b < 1 || b > m) continue;if(dist[a][b] >= 0) continue;//记录马的步数dist[a][b] = dist[t.first][t.second] + 1;//入队tail++;q[tail] = {a, b};   }}
}int main()
{scanf("%d %d %d %d", &n, &m, &x, &y);bfs(x, y);for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){printf("%-5d", dist[i][j]);}printf("\n");}return 0;
}

AC !!!!!!!!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。 

http://www.lryc.cn/news/45697.html

相关文章:

  • 【新2023Q2模拟题JAVA】华为OD机试 - 总最快检测效率 or 核酸检测效率
  • 基于主成分分析的混音方法
  • Code Two Exchange Crack
  • jQuery.form.js 详细用法_维护老项目使用
  • 【Java】关于你不知道的Java大整数运算之BigInteger类超级好用!!!
  • 运维是不是没有出路了?
  • 【C++笔试强训】第七天
  • mysql binlog 一直追加写,磁盘满了怎么办?
  • 缓存穿透、缓存雪崩、缓存击穿解决方案
  • web + servlet + jdbc mysql 实现简单的表单管理界面
  • Maven 国内镜像仓库
  • day21 ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
  • 大学计算机(软件类)专业推荐竞赛 / 证书 官网及赛事相关信息整理
  • Metasploit入门到高级【第九章】
  • JDK之8后: 协程? 虚拟线程!!!
  • 体验 jeecg
  • 投稿指南【NO.13】计算机学会CCF推荐期刊和会议分享(人工智能)
  • 一份sql笔试
  • 交换瓶子
  • 二、Docker安装、启动、卸载、示例
  • 开心档之C++ STL 教程
  • Thread 类的基本用法
  • 2023.3.28 天梯赛训练赛补题(病毒溯源 , 龙龙送外卖 , 红色警报)
  • 917. 仅仅反转字母
  • Linux-Git
  • leetcode:2273. 移除字母异位词后的结果数组(python3解法)
  • 基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用
  • 4.4---Spring框架之Spring事务(复习版本)
  • IP-Guard是否支持禁止客户端电脑卸载指定软件?
  • 系统图标形状overlayapk