lua: 比较嵌套表中的条目

我需要将{CLOSED}中的每个'pos'复制到{PATH}中,但按它们从‘target’开始的‘came_from’顺序排序。这是路径查找方法的最后一部分。我无法将伪代码转换为lua代码并需要帮助。如果有人能将伪代码转换为代码,我认为我会更容易理解,因为这里有一些相互混淆的基本原理。

例如 path={{x=33,y=44},{x=22,y=25},{x=0,y=0}}

start={x=0,y=0}
target={x=33,y=44}
CLOSED={
    {pos={x=33,y=44},came_from={x=22,y=25}},
    {pos={x=0,y=0},came_from={x=nil,y=nil}},
    {pos={x=22,y=25},came_from={x=0,y=0}}
}
PATH={}

--概述:
current=target

while current~=start do
    add(path,current)
--??    current=CLOSED[i].came_from[current]??
--未完成的步骤:
--检查每个CURRENT是否符合每个
--CLOSED[i].pos
--如果找到匹配的,
--current=closed[i].came_from
--重新开始
end
点赞
用户11361179
用户11361179

表格不能直接比较,除非它们被特别赋值给彼此(即{a}={b})。因此,您必须获取并比较相同变量的所有键的个别值(即x和y)。下面的函数可以做到这一点,如果它们得到匹配,则返回true。另一个更具体的方法是将2d坐标转换为1d坐标并比较整数(对于nxm矩阵,其x+m*y)。

start={x=0,y=0}
target={x=33,y=44}
closed={
    {pos={x=33,y=44},came_from={x=22,y=25}},
    {pos={x=0,y=0},came_from={x=nil,y=nil}},
    {pos={x=22,y=25},came_from={x=0,y=0}}
}
path={}

--概要:
current=target
function subset(a,b)
    for k,v in pairs(a) do
  if b[k]~=v then return false end
    end
 return true
end
function equal(a,b)
 return subset(a,b) and subset(b,a)
end

while current.x~=start.x and current.y~=start.y do
    --检查当前状态与每个closed[i].pos是否匹配,
    --如果匹配,则将current更新为closed[i].came_from,继续循环
 add(path,current)
    for i=1,#closed do
        if equal(current,closed[i].pos) then
            current=closed[i].came_from
            break
        end
    end
end
add(path,start)

--预期输出:{{x=33,y=44},{x=22,y=25},{x=0,y=0}}
--检查:
for k,v in pairs(path) do
    for k,v in pairs(v) do
    print(k.."="..tostr(v))
    end
end
2021-07-24 19:51:47