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开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.