“最近的未被访问的出口”是指“最近的有未被访问的出口的房间”。
使用房间坐标,您可以构建 2D 地图。任何 (x,y) 瓦片都可以是以下三种类型之一:
类型 2:已访问和已访问的所有出口(表示为 #)
类型 1:访问了未访问的出口(表示为 X)
类型 0:未访问(表示为空格)
例如:
12345678
1
2 #X##
3 ###X
4 #
5 ##
6 X###
7 ###
8 X
查找最近的未访问出口是一个简单的广度优先搜索问题,从您在此地图中的位置开始。假设您像这样表示地图的一个单元格:
{
x = 2,
y = 2,
type = 1,
exits = {
east = cell_east,
west = cell_west,
}
}
你可以写这样的东西来获取最近的房间列表,其中至少有一个未访问的出口:
local visited = {}
local visit = function(to_visit)
if #to_visit == 0 then return nil end
local next,found = {},{}
for i=1,#to_visit do visited[#visited+1] = to_visit[i] end
for _,cell in ipairs(to_visit) do
if cell.type == 1 then
found[#found+1] = cell
elseif cell.type == 2 then
for _,exit in pairs(cell.exits) do
if exit.type > 0 then next[#next+1] = exit end
end
else
error("something went wrong")
end
end
if #found > 0 then
return found
else
return visit(next)
end
end
my_list = visit({current_cell})
这是未经测试的,不一定是解决问题的最优雅或最有效的方法,但它应该给你一个想法:)