Lua填字游戏求解器开发:遍历表格时如何忽略不匹配结果?
填字游戏求解器Lua实现方案
核心问题修正:不匹配字符不替换
你当前代码的问题在于,遇到单词首字符就开始边匹配边修改表格,中途失败时错误地把首字符改成了*。正确逻辑是先验证完整单词是否存在,确认匹配成功后再批量替换字符,而非边匹配边修改。
具体执行步骤:
- 遍历每行的每个位置,检查当前字符是否为单词首字符
- 若匹配首字符,尝试向后逐个验证剩余字符,确认整个单词是否完整存在
- 只有当单词完全匹配时,才将对应位置的所有字符替换为
* - 若中途不匹配,直接放弃当前位置,继续查找下一个首字符
多单词重叠处理方案
当字符属于多个单词时,直接修改原表格会导致后续单词查找失败。解决思路如下:
- 保留原始表格的深拷贝,所有单词的查找都基于原始副本进行,避免修改操作影响后续查找
- 为每个单词记录匹配成功的所有坐标位置(行号、列号)
- 所有单词查找完成后,统一遍历原始表格,将所有记录的坐标位置替换为
* - 最后将剩余非
*字符拼接成结果字符串
完整示例代码
-- 创建表格深拷贝的工具函数 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
相关产品推荐
相关产品推荐

