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如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1