You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua填字游戏求解器开发:遍历表格时如何忽略不匹配结果?

填字游戏求解器Lua实现方案

核心问题修正:不匹配字符不替换

你当前代码的问题在于,遇到单词首字符就开始边匹配边修改表格,中途失败时错误地把首字符改成了*。正确逻辑是先验证完整单词是否存在,确认匹配成功后再批量替换字符,而非边匹配边修改。

具体执行步骤:

  • 遍历每行的每个位置,检查当前字符是否为单词首字符
  • 若匹配首字符,尝试向后逐个验证剩余字符,确认整个单词是否完整存在
  • 只有当单词完全匹配时,才将对应位置的所有字符替换为*
  • 若中途不匹配,直接放弃当前位置,继续查找下一个首字符

多单词重叠处理方案

当字符属于多个单词时,直接修改原表格会导致后续单词查找失败。解决思路如下:

  1. 保留原始表格的深拷贝,所有单词的查找都基于原始副本进行,避免修改操作影响后续查找
  2. 为每个单词记录匹配成功的所有坐标位置(行号、列号)
  3. 所有单词查找完成后,统一遍历原始表格,将所有记录的坐标位置替换为*
  4. 最后将剩余非*字符拼接成结果字符串

完整示例代码

-- 创建表格深拷贝的工具函数
local function copySchema(schema)
    local copy = {}
    for i, row in ipairs(schema) do
        copy[i] = {}
        for j, char in ipairs(row) do
            copy[i][j] = char
        end
    end
    return copy
end

-- 查找单个单词(左到右方向),返回匹配的坐标列表
local function findWordHorizontal(originalSchema, word)
    local matches = {}
    local wordLen = #word
    for rowIdx, row in ipairs(originalSchema) do
        local rowLen = #row
        -- 剩余长度不足单词长度时直接跳过,避免无效遍历
        for colIdx = 1, rowLen - wordLen + 1 do
            local isMatch = true
            for k = 1, wordLen do
                if row[colIdx + k - 1] ~= string.sub(word, k, k) then
                    isMatch = false
                    break
                end
            end
            if isMatch then
                -- 记录该单词每个字符的坐标
                for k = 0, wordLen - 1 do
                    table.insert(matches, {row = rowIdx, col = colIdx + k})
                end
                -- 若需要查找所有匹配项,注释下面的return即可
                return matches
            end
        end
    end
    return {}
end

-- 主函数:处理表格和单词列表,返回处理后的表格与剩余字符字符串
local function solveCrossword(schema, wordList)
    local original = copySchema(schema)
    local allMatches = {}

    -- 遍历所有单词,收集所有匹配坐标
    for _, word in ipairs(wordList) do
        local matches = findWordHorizontal(original, word)
        for _, pos in ipairs(matches) do
            table.insert(allMatches, pos)
        end
    end

    -- 创建结果表格,统一替换匹配字符为*
    local resultSchema = copySchema(schema)
    for _, pos in ipairs(allMatches) do
        resultSchema[pos.row][pos.col] = "*"
    end

    -- 拼接剩余非*字符
    local remainingChars = ""
    for _, row in ipairs(resultSchema) do
        for _, char in ipairs(row) do
            if char ~= "*" then
                remainingChars = remainingChars .. char
            end
        end
    end

    return resultSchema, remainingChars
end

-- 测试示例
local schema = {
    {"A","B","C","D","H","F","G","W","T","Y"},
    {"U","H","E","L","L","O","I","I","O","L"},
    {"G","F","D","R","Y","T","R","G","R","R"}
}

local words = {"HELLO"}
local processedSchema, remaining = solveCrossword(schema, words)

-- 打印处理后的表格
print("处理后的表格:")
for _, row in ipairs(processedSchema) do
    print(table.concat(row, " "))
end

-- 打印剩余字符
print("\n剩余字符:" .. remaining)

代码说明

  • copySchema:生成表格的深拷贝,确保原始数据不被修改,为多单词查找提供可靠数据源
  • findWordHorizontal:仅基于原始表格查找左到右方向的单词,返回匹配坐标列表,全程不修改原表格
  • solveCrossword:主协调函数,负责单词查找、坐标收集、统一替换、剩余字符拼接等全流程
  • 若需要支持其他查找方向(如上到下、对角线),只需新增对应的查找函数即可扩展功能

内容的提问来源于stack exchange,提问作者Antonio Tubaldi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:35:27