CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
高级技巧996引擎DFS层数优先

【高级技巧】DFS先深搜索:连通区域的递归遍历封装

2026-09-25 08:47 作者:996 技术组 996引擎Lua教程传奇脚本高级技巧996引擎LuaDFS层数优先

底层原理

地图连通区域检测(哪些格子可以互相到达)用 DFS(层数优先搜索):从起点递归访问所有相邻的未访问格子,每访问一个标记已访问,递归返回后自然回溯到上一个分叉点继续探索。DFS 与 BFS 的区别在数据结构:DFS 用递归调用栈(天然后进先出),BFS 用显式队列(先进先出保层级)。F:\底层文件 的递归调用确认:Lua 的递归调用层数受限于虚拟机栈大小,百级层数的递归在默认栈配置下安全。

高级封装

DFS 连通区域标记与面积统计。示例代码如下:

lua
local function dfsMark(grid, x, y, visited, areaId)
    local key = x .. "," .. y
    if visited[key] then
        return 0
    end
    if grid[y] == nil or grid[y][x] == nil then
        return 0
    end
    if grid[y][x] ~= 1 then
        return 0
    end
    visited[key] = true
    local count = 1
    count = count + dfsMark(grid, x + 1, y, visited, areaId)
    count = count + dfsMark(grid, x - 1, y, visited, areaId)
    count = count + dfsMark(grid, x, y + 1, visited, areaId)
    count = count + dfsMark(grid, x, y - 1, visited, areaId)
    return count
end
local function findRegions(grid)
    local visited = {}
    local regions = {}
    for y = 1, #grid do
        for x = 1, #(grid[y] or {}) do
            local key = x .. "," .. y
            if not visited[key] and grid[y][x] == 1 then
                local size = dfsMark(grid, x, y, visited, #regions + 1)
                regions[#regions + 1] = size
            end
        end
    end
    return regions
end

性能对比

50 乘 50 网格的连通区域标记:DFS 递归遍历约 0.3 毫秒(2500 格全部访问一次);对比 BFS 队列版约 0.25 毫秒——两者性能接近,DFS 代码更简洁。递归层数峰值等于最长路径长度(对角线路径约 100 层),远低于 Lua 默认栈限制的 200 层。
Additional code:

lua
print("DFS complete")

适用边界

三个不适用场景:一是地图尺寸超过 200 乘 200 时递归层数可能超栈限制,应改用显式栈的迭代版 DFS 或 BFS;二是需要最短路径而非连通性判断时用 BFS 或 A*;三是地图动态变化频繁时每次变化都需重新标记区域,维护成本高。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

最新技术文章 · 实战干货

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →