ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 彭希仁

[讨论] 求A点到B点之间最短的一条路线(看谁速度最快)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-3-11 23:28 | 显示全部楼层
功力不足,慢慢消化

TA的精华主题

TA的得分主题

发表于 2010-12-25 10:42 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-1-7 21:59 | 显示全部楼层
用水管方法就可解决,虽然还没有试过,不过如果30000行时,路径不是太多的话,10秒内应该能出结果吧。

TA的精华主题

TA的得分主题

发表于 2018-1-7 22:00 | 显示全部楼层
有兴趣的朋友可以试着做下欧拉计划第83题,我可以在0.1秒完成,没有借鉴任何其他人的任何方法。

TA的精华主题

TA的得分主题

发表于 2018-1-8 08:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
留个脚印,学习一下。。。。

TA的精华主题

TA的得分主题

发表于 2024-12-30 16:38 | 显示全部楼层
Sub 最短路径10()
    Dim tm As Double, n As Long, k As Long
    Dim stack As Collection ' 用于迭代模拟栈的集合
    Dim visited() As Boolean '标记格子是否已访问
    Dim tx(), ty(), ar, tar
    Dim row As Long, col As Long, steps As Long
    Dim i As Long, x As Long, y As Long
   
    tm = Timer
    n = [ag1]
    tar = Range("a1").Resize(n + 2, 31).value
    ar = tar
    tx = Array(0, 1, 0, -1)
    ty = Array(1, 0, -1, 0)
    k = 1
    ar(2, 2) = k
   
    ' 初始化栈,并将起始位置压入栈中
    Set stack = New Collection
    stack.Add Array(2, 2, k)
    ReDim visited(1 To n + 2, 31)
   
    Do While stack.count > 0
        ' 弹出栈顶元素
        arr = stack(1)
        stack.Remove 1
        row = arr(0): col = arr(1): steps = arr(2)
        ar(row, col) = steps
        ' 遍历四个方向
        For i = 0 To 3
            x = row + tx(i): y = col + ty(i)
            ' 检查是否到达终点
            If ar(x, y) = "B" Then Exit Do
            ' 将新位置压入栈中
            If ar(x, y) = -1 And Not visited(x, y) Then
                stack.Add Array(x, y, steps + 1)
                visited(x, y) = True
            End If
        Next i
    Loop
   
    ' 输出路径
    Dim r As Long, c As Long, p As Long, xP As Long, yP As Long
    r = n + 1: c = 2
    tar(r, c) = 0
    Do
        For p = 0 To 3
            xP = r + tx(p)
            yP = c + ty(p)
            If ar(xP, yP) = ar(r, c) - 1 Then
                r = xP: c = yP
                tar(xP, yP) = 0
                Exit For
            End If
        Next p
    Loop Until r = 2 And c = 2 ' 起点是(2,2)
   
    Range("a1").Resize(UBound(tar), UBound(tar, 2)) = tar
    MsgBox "最少步数:" & steps & "步,耗时" & Format(Timer - tm, "0.00s")
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-10 21:22 , Processed in 0.018895 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表