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的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、