Python-VBA编程500例-015-03(入门级)

2024-03-23 14:12

本文主要是介绍Python-VBA编程500例-015-03(入门级),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

飞行棋(Flying Chess)算法是一种搜索算法,主要用于解决图搜索和路径规划问题。它的主要特点是可以“飞跃”到棋盘上任何位置,从而大大减少了搜索的时间和空间复杂度。以下是一些飞行棋算法的实际应用场景:

1、路径规划:在机器人领域,飞行棋算法可以用于规划机器人的运动路径。机器人可以根据当前的位置和目标位置,通过飞行棋算法找到一条最优的路径。

2、网络路由:在计算机网络中,飞行棋算法可以用于数据包的路由选择。通过计算数据包从源节点到目标节点的最优路径,可以提高网络传输的效率。

3、资源分配:在资源分配问题中,飞行棋算法可以用于寻找最优的资源分配方案。例如,在任务调度问题中,可以使用飞行棋算法找到最优的任务分配方案。

4、旅行商问题:在经典的旅行商问题(TSP)中,飞行棋算法可以用于寻找最短的旅行路线。旅行商需要访问一组城市,并在这些城市之间旅行,目标是找到一条总距离最短的路线。

5、图像分割:在计算机视觉领域,飞行棋算法可以用于图像分割问题。通过对图像进行网格化处理,可以将图像分割问题转化为图搜索问题,进而使用飞行棋算法求解。

6、游戏AI:在游戏开发中,飞行棋算法可以用于游戏AI的实现。例如,在策略游戏中,AI可以使用飞行棋算法来规划单位的移动和攻击。

7、模拟实验与科学研究:在科学研究中,有时需要模拟随机过程来观察和分析系统的行为。飞行棋算法的原理可以用于构建简单的随机模型,用于模拟和测试某些现象或系统的特性。例如,在生物学或物理学领域,研究人员可能会使用类似的随机算法来模拟种群动态、粒子运动等复杂过程。

总之,飞行棋算法在很多需要解决图搜索和路径规划问题的领域都有实际应用场景。

1、 飞行棋(SPFA): 

1-1、Python:
# 1.问题描述:
# 一维棋盘,起点在棋盘的最左侧,终点在棋盘的最右侧,棋盘上有几个位置和其他位置相连,如果pos1和pos2相连,但连接是单向的,即当棋子落在位置pos1时,
# 可以选择不投骰子,直接移动棋子从pos1到pos2,但不能从pos2移动到pos1.给定这个棋盘的长度length和位置的相连情况connections,用六面骰子(点数1-6),
# 问最少需要投几次骰子才能到达终点?
# 2.问题示例:
# 输入length = 10 和 connections = [[2, 10]],输出结果为1;即0 -> 2(投骰子), 2 -> 10(直接相连);输入length = 15 和 connections =
# [[2, 8], [6, 9]],输出结果为2,即0 -> 6(投骰子), 6 -> 9(直接相连),9 -> 15(投骰子).
# 3.代码实现:
class Solution:def flying_chess(self, length, connections) :# 初始化距离数组,所有位置到起点的初始距离设为无穷大dist = [float('inf')] * (length + 1)# 初始化访问数组,记录位置是否被访问过vis = [0] * (length + 1)# 初始化队列,用于广度优先搜索Q = [0] * (length + 1)# 队列起始位置st = 0# 队列结束位置ed = 0# 起点到起点的距离为0dist[1] = 0# 标记起点为已访问vis[1] = 1# 将起点加入队列Q[ed] = 1# 队列结束位置向后移动ed += 1# 当队列不为空时,执行循环while st < ed:# 队列头部元素出队u = Q[st]# 队列起始位置向后移动st += 1# 标记当前位置为未访问,因为接下来要检查它的邻居vis[u] = 0# 遍历所有的连接点for roads in connections:# 如果连接点的起点不是当前位置,则跳过if roads[0] != u:continue# 连接点的目标位置v = roads[1]# 如果通过当前位置到达目标位置的距离更短,则更新距离if dist[v] > dist[u]:dist[v] = dist[u]# 如果目标位置未被访问过if vis[v] == 0:# 标记目标位置为已访问vis[v] = 1# 将目标位置加入队列Q[ed] = v# 队列结束位置向后移动ed += 1# 遍历从当前位置连续向前跳1到6步的所有可能位置for i in range(1, 7):# 如果跳步后的位置超出了棋盘长度,则停止检查if i + u > length:break# 跳步后的位置v = i + u# 如果通过当前位置连续跳步到达目标位置的距离更短,则更新距离if dist[v] > dist[u] + 1:dist[v] = dist[u] + 1# 如果目标位置未被访问过if vis[v] == 0:# 标记目标位置为已访问vis[v] = 1# 将目标位置加入队列Q[ed] = v# 队列结束位置向后移动ed += 1# 返回从起点到终点的最少步数return dist[length]
# 主函数
if __name__ == '__main__':# 初始化棋盘长度length = 15# 初始化跳点集合connections = [[2, 8], [6, 9]]# 创建Solution对象solution = Solution()# 输出棋盘长度print("棋盘长度:", length)# 输出跳点连接print("跳点连接:", connections)# 调用flying_chess函数并输出结果print("最少需要步数:", solution.flying_chess(length, connections))
# 4.运行结果:
# 棋盘长度: 15
# 跳点连接: [[2, 8], [6, 9]]
# 最少需要步数: 2
1-2、VBA:
Rem 自定义函数,功能:飞行棋(SPFA)
Function flying_chess(length As Integer, connections As Variant) As VariantDim dist() As DoubleDim vis() As IntegerDim Q() As IntegerDim st As IntegerDim ed As IntegerDim u As IntegerDim v As IntegerDim i As IntegerDim roads As Variant' 初始化数组ReDim dist(1 To length + 1)ReDim vis(1 To length + 1)ReDim Q(1 To length + 1)' 初始化距离和访问状态For i = 1 To length + 1dist(i) = 99 ^ 99vis(i) = 0Next i' 设置起点和队列st = 1ed = 1dist(1) = 0vis(1) = 1Q(ed) = 1ed = ed + 1' 主循环While st < edu = Q(st)st = st + 1vis(u) = 0' 遍历连接For Each roads In connectionsv = roads(1)If v <= length ThenIf dist(roads(1)) > dist(v) Thendist(v) = dist(u)If vis(v) = 0 Thenvis(v) = 1Q(ed) = ved = ed + 1End IfEnd IfEnd IfNext roads' 遍历跳跃For i = 1 To 6v = u + iIf v > length Then Exit ForIf dist(v) > dist(u) + 1 Thendist(v) = dist(u) + 1If vis(v) = 0 Thenvis(v) = 1Q(ed) = ved = ed + 1End IfEnd IfNext iWend' 返回到达指定长度的最少步数flying_chess = dist(length)
End Function
Rem 执行过程,功能:调用自定义函数flying_chess,以弹窗方式输出结果
Sub TestRun()' 定义变量Dim length As IntegerDim connections As VariantDim result As IntegerDim i As Integer, j As Integer' 输入棋盘长度length = 15' 输入跳点集合,针对每个子区间,都可以直连,即骰子投出2时,可以实现先走两步,再通过起跳点2直接到达8的位置;骰子投出6时,可以实现先走六步,再通过起跳点6直接到达9的位置connections = Array(Array(2, 8), Array(6, 9))' 调用自定义函数,返回到达指定长度的最少步数result = flying_chess(length, connections)'输出结果MsgBox "棋盘长度:" & length & vbCrLf & _"跳点连接:" & vbCrLf & Join(Application.Transpose(Application.index(connections, 0, 1)), ", ") & " => " & Join(Application.Transpose(Application.index(connections, 0, 2)), ", ") & vbCrLf & _"最少需要步数:" & result, vbInformation, "飞行棋"
End Sub

注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行TestRun程序,以弹窗方式输出结果。

2、相关文章:

2-1、Python-VBA编程500例-014-01(入门级)

2-2、Python-VBA编程500例-014-02(入门级)

2-3、Python-VBA编程500例-015-01(入门级) 

2-4、Python-VBA编程500例-015-02(入门级) 

Myelsa的Python算法之旅(高铁直达):https://myelsa1024.blog.csdn.net/article/details/136889623?spm=1001.2014.3001.5502
欢迎访问个人主页:非风V非雨-CSDN博客
欢迎志同道合者一起交流学习,我的QQ:94509325/微信:

 

这篇关于Python-VBA编程500例-015-03(入门级)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/838549

相关文章

python版本切换工具pyenv的安装及用法

《python版本切换工具pyenv的安装及用法》Pyenv是管理Python版本的最佳工具之一,特别适合开发者和需要切换多个Python版本的用户,:本文主要介绍python版本切换工具pyen... 目录Pyenv 是什么?安装 Pyenv(MACOS)使用 Homebrew:配置 shell(zsh

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

Python使用Matplotlib和Seaborn绘制常用图表的技巧

《Python使用Matplotlib和Seaborn绘制常用图表的技巧》Python作为数据科学领域的明星语言,拥有强大且丰富的可视化库,其中最著名的莫过于Matplotlib和Seaborn,本篇... 目录1. 引言:数据可视化的力量2. 前置知识与环境准备2.1. 必备知识2.2. 安装所需库2.3

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处