第十五届蓝桥杯pb组国赛E题[马与象] (15分)BFS算法 详解

news2024/11/17 3:54:15

博客主页:誓则盟约

系列专栏:IT竞赛 专栏

关注博主,后期持续更新系列文章

如果有错误感谢请大家批评指出,及时修改

感谢大家点赞👍收藏⭐评论✍


问题描述:

        小蓝有一个大小为 N × N 的棋盘(棋子可以走的位置有 (N + 1) × (N + 1) 个),棋盘上只有两个棋子:一个马和一个象,他们的行动规则是:马走日,马 可以走到一个日字形状的对角;象飞田,象可以走到一个田字形状的对角,即 斜着走两格(注意无需遵守象棋中的蹩马腿、塞象眼的规则)。在下图所示的大 小为 4 × 4 的棋盘上,展示了两种棋子具体的行进方式:

        在任意一方先手、每一方都可以连续走任意步的情况下,请问有没有可能 出现一方吃掉另一方的局面,如果有,请输出最少需要经过几步可以达到这个 局面,否则输出 −1 。注意:棋子不能走出棋盘。 

【输入格式】

        输入一行包括五个整数 N, x1, y1, x2, y2 ,相邻整数之间使用一个空格分隔, 表示棋盘大  小、马的初始位置 (x1, y1) 以及象的初始位置 (x2, y2) 。

【输出格式】

  输出一行包含一个整数表示答案。如果答案不存在输出 −1 。

【样例输入】

  4 0 2 1 2

【样例输出】

  3

【样例说明】

【样例输入】

  4 2 2 2 3

【样例输出】

  2

【样例说明】

  各走一步可能出现一方吃掉另一方的局面。

【评测用例规模与约定】

  对于 50% 的评测用例,1 ≤ N ≤ 10 ; 对于所有评测用例,1 ≤ N ≤ 50 ,0 ≤ x1, y1, x2, y2 ≤ N 。 


 分析问题:

        首先,这个问题很明显是在考察BFS的运用,马和象的可移动规则给了,我们只需要给这两个规则转化为两个dirs,遍历其中一个dirs(这里我们以象为终点,首先遍历象的方向)将其可能到达的坐标加入到列表ls里面存储起来,然后去遍历另一个(马)可能走到的坐标,如果这个坐标在ls里面,那说明他们可以相遇,直接返回当前步数即可(因为我们是BFS广度 优先,此时的步数一定是最少的步数,可以直接返回)。如果没有存在ls里,则继续遍历,直到遍历完所有可以走的坐标为止,此时则说明二者不能相遇,则返回-1即可。这是当前的大致思路,主要还是看代码实现,这道题用了两个BFS,严格考察对BFS和队列的理解和运用能力。


代码实现: 


n,x1,y1,x2,y2=map(int,input().split())

def BFSM(n,x1,y1,x2,y2):
    dirs={lambda x,y:(x+1,y+2),
          lambda x,y:(x+2,y+1),
          lambda x,y:(x+2,y-1),
          lambda x,y:(x+1,y-2),
          lambda x,y:(x-1,y-2),
          lambda x,y:(x-2,y-1),
          lambda x,y:(x-2,y+1),
          lambda x,y:(x-1,y+2)
          }
    dirs2={lambda x,y:(x-2,y+2),
           lambda x,y:(x+2,y+2),
           lambda x,y:(x+2,y-2),
           lambda x,y:(x-2,y-2),}
    seen=set()
    st=(x1,y1)
    ed=(x2,y2)
    seen.add(st)
    q=[(st,0)]
    p=[(ed,0)]
    seen_1={}
    seen_1[ed]=0
    ls=[]
    while p:
        now_1,step_1=p.pop(0)
        for dir in dirs2:
            new_1=dir(now_1[0],now_1[1])
            if 0<=new_1[0]<=n+1 and 0<=new_1[1]<=n+1 and new_1 not in seen_1.keys():
                seen_1[new_1]=step_1+1
                p.append([new_1,step_1+1])
                
    while q:
        now_node,step=q.pop(0)
        if now_node in seen_1.keys():
            kk=step+seen_1[now_node]
            ls.append(kk)
        for dir in dirs:
            new_node=dir(now_node[0],now_node[1])
            if 0<=new_node[0]<=n+1 and 0<=new_node[1]<=n+1 and new_node not in seen:
                seen.add(new_node)
                q.append([new_node,step+1])
    if ls:
        return min(ls)
    else: return -1
print(BFSM(n,x1,y1,x2,y2))

总结:

        这里的n指的是棋盘的边长,而x1y1是起点的坐标,x2y2是终点的坐标。函数BFSM使用了广度优先搜索(Breadth-First Search, BFS)算法,它是一种在图论中用于遍历图或树的数据结构的算法。在这个问题中,图是nn的棋盘,节点是棋盘上的每个位置,边是骑士可以走的合法移动。

下面是代码分步功能的详细解释:

  1. dirs是一个包含八个函数的集合,每个函数代表骑士可以走的八种合法移动的方向。例如,lambda x,y:(x+1,y+2)表示骑士可以从(x, y)移动到(x+1, y+2)

  2. dirs2是一个包含四种函数的集合,每个函数代表终点(x2, y2)可以到达的四个特殊位置。这些位置是终点位置的四个对角线方向上两个单位距离的位置。

  3. seen是一个集合,用于记录已经访问过的节点。

  4. q是广度优先搜索的队列,用于存储待访问的节点及其到起点的距离。

  5. p是另一个队列,用于存储从终点开始的访问过程,目的是找到从终点到起点的路径。

  6. seen_1是一个字典,用于记录从终点开始访问过程中每个节点到终点的距离。

  7. 函数BFSM首先初始化seen集合和q队列,然后开始广度优先搜索。

  8. 在广度优先搜索的过程中,每次检查当前节点now_node是否在seen_1中,如果是,则计算从起点到当前节点的距离加上从当前节点到终点的距离,并将这个总距离添加到ls列表中。

  9. 然后,对于当前节点的每个合法移动方向,检查新位置是否在棋盘。

整体逻辑是通过BFS算法搜索从起点到终点的最短路径。


“ 我们的科学永远只是找到近似真理。”——《爱因斯坦》

“ 我们的科学永远只是找到近似真理。”——《爱因斯坦》

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

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

相关文章

110.网络游戏逆向分析与漏洞攻防-装备系统数据分析-装备与技能描述信息的处理

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

javaWeb项目-ssm+vue医院住院信息管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java简介 现代社…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:AI智能监控 用于沙滩救援

以色列的一个团队在人工智能领域取得的成果引起了轰动。 今天他们取得的成果源于多年前的一个想法。Netanel Eliav 和 Adam Bismut 是校园时代的旧伙伴&#xff0c;当时他们想要解决一个可以改变世界的问题&#xff0c;由此引出这样一个想法&#xff1a;溺水的 Bismut 漂流到死…

RV32M指令集

RV32M指令集 1、乘法运算2、除法运算1、乘法运算 MUL 指令(得到整数32位乘积(64位中的低32位)) MUL 指令用于执行两个带符号或无符号整数之间的乘法运算。其语法如下: mul rd, rs1, rs2 它将寄存器 rs1 和 rs2 中的值相乘,并将结果写入寄存器 rd 中。如果 rs1 和 rs2 都是有…

catia零件装配时预览零件的形状

这样的显示方式看不到 选择大或中图标就可预览零件形状

基于STM32的智能水产养殖系统(二)

TPS5433IDR TPS5433IDR 是一款由德州仪器 (Texas Instruments) 生产的高效降压转换器&#xff08;Buck Converter&#xff09;。它能够将较高的输入电压转换为较低的输出电压&#xff0c;适用于各种电源管理应用。 主要特性 输入电压范围: 5.5V 至 36V输出电压范围: 0.9V 至 …

惊艳的短视频:成都科成博通文化传媒公司

惊艳的短视频&#xff1a;瞬间之美&#xff0c;震撼心灵 在数字化时代&#xff0c;短视频以其短小精悍、内容丰富的特点&#xff0c;迅速占领了我们的屏幕和时间。而在这个浩如烟海的视频海洋中&#xff0c;总有一些短视频能够脱颖而出&#xff0c;以其惊艳的视觉效果、深刻的…

设计模式-代理模式(结构型)

代理模式 代理模式是一种结构型模式&#xff0c;它可以通过一个类代理另一个类的功能。代理类持有被代理类的引用地址&#xff0c;负责将请求转发给代理类&#xff0c;并且可以在转发前后做一些处理 图解 角色 抽象主题&#xff08;Subject&#xff09;: 定义代理对象和被代理…

足球实况分析系统YOLO

① 足球运动员、裁判和球检测&#xff1b; ② 球员球队预测&#xff1b; ③ 足球地图上球员和球位置的估计&#xff1b; ④ 足球跟踪&#xff1b; 当你启动应用程序时&#xff0c;会自动加载两个演示视频以及推荐的设置和超参数. 1. 使用侧栏菜单“浏览文件”按钮上传视频…

什么是OCR转写服务?

OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;转写服务是一种技术&#xff0c;用于将图像或扫描文档中的文字转换为可编辑的文本格式。这项服务通过识别图像中的文字&#xff0c;并将其转换成计算机可读的文本形式&#xff0c;从而使得用…

力扣39. 组合总和

Problem: 39. 组合总和 文章目录 题目描述思路及解题方法复杂度Code 题目描述 思路及解题方法 1.创建一个 res 变量存储所有满足条件的组合结果,使用 track 变量记录当前的组合路径,使用 trackSum 变量记录当前路径中元素的和。 2.回溯方法 backtrack&#xff1a; 2.1.基本情况…

【技巧】让xorg和gnome不要使用GPU

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 默认xorg会使用GPU加速&#xff1a; 现在取消他对GPU的占用&#xff1a; sudo vim /etc/X11/xorg.conf修改或添加以下内容&#xff1a; Section &quo…

9个优秀的Text2Sql(Chat2Sql)开源项目、资源

过去&#xff0c;领导、决策者或业务人员想要统计个数据、做个报告&#xff0c;总是绕不开技术人员的支持。领导需要将想法告诉技术人员&#xff0c;技术人员再将领导的想法转成技术语言&#xff08;例如&#xff1a;sql&#xff09;&#xff0c;然后对数据进行统计分析&#x…

electron基础使用

安装以及运行 当前node版本18&#xff0c;按照官网提供操作&#xff0c;npm init进行初始化操作&#xff0c;将index.js修改为main.js&#xff0c;执行npm install --save-dev electron。&#xff08;这里我挂梯子下载成功了。&#xff09;&#xff0c;添加如下代码至package.…

政务云参考技术架构

行业优势 总体架构 政务云平台技术框架图&#xff0c;由机房环境、基础设施层、支撑软件层及业务应用层组成&#xff0c;在运维、安全和运营体系的保障下&#xff0c;为政务云使用单位提供统一服务支撑。 功能架构 标准双区隔离 参照国家电子政务规范&#xff0c;打造符合标准的…

TensorFlow图像识别项目

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 目录 今天我们将讨论如何部署Flask项…

星网络 StarNet: Rewrite the Stars

论文题目&#xff1a;Rewrite the Stars 论文链接&#xff1a;http://arxiv.org/abs/2403.19967 代码链接&#xff1a;https://github.com/ma-xu/Rewrite-the-Stars 一、摘要 揭示星操作将输入映射到高维、非线性特征空间的能力——类似于核技巧——而无需扩展网络。提出了S…

第7章 用户输入和 while 循环

第7章 用户输入和 while 循环 7.1 函数 input()的工作原理7.1.1 编写清晰的程序7.1.2 使用 int()来获取数值输入7.1.3 求模运算符 7.2 while 循环简介7.2.1 使用 while 循环7.2.2 让用户选择何时退出7.2.3 使用标志7.2.4 使用 break 退出循环7.2.5 在循环中使用 continue7.2.6 …

Django DetailView视图

Django的DetailView是一个用于显示单个对象详情的视图。下面是一个使用DetailView来显示单个书籍详情的例子。 1&#xff0c;添加视图 Test/app3/views.py from django.shortcuts import render# Create your views here. from django.views.generic import ListView from .m…

deepin V23 新进展!deepin 成功适配 MilkV Mars

内容来源&#xff1a;deepin&#xff08;深度&#xff09;社区 deepin-ports SIG&#xff08;Special Interest Group&#xff0c;特别兴趣小组&#xff09;&#xff0c;deepin&#xff08;深度&#xff09;社区积极与各大厂商展开合作&#xff0c;参与对 RISC-V 架构和设备的适…