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中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析