Multidim Array,检查不存在的邻居

时间:2014-10-19 11:44:03

标签: arrays list multidimensional-array lua

有一个这样的清单:

people[i][j] 

其中 i j 都从0缩放为 n

每个条目如下:

people[1][1] = {genome = 0x000000, immune = 0, healing = 0}

现在,我正在遍历各个人并检查每个邻居,如:

if people[i][j+1] then ....
if people[i][j-1] then ....
if people[i+1][j] then ....
if people[i-1][j] then ....

但那些站在阵列边界的人,在一个或两个方向上没有邻居,这是我的问题。

  

尝试索引字段'?' (零值)

我知道为什么这个错误即将来临,但我现在已经知道如何在我的场景中解决这个问题。

(顺便说一句:我正在尝试解决这个难题,也许这些信息可以帮助您理解我的情景 因为我必须检查邻居。 https://codegolf.stackexchange.com/questions/38446/be-an-epidemiologist

n * 4 - 4个条目,只有3个和4个条目,只有2个邻居。我可以将它们存储在一个额外的列表中,我可以使用其他的checkprocedure,但我认为这将是一个非常糟糕的解决方案。 此外,应有的表现在这里是个大问题。 (假设 n 为1000,每次抽奖必须完成4次检查1000次,多次抽签。

2 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题,这里有两种方法:

if people[i+1] and people[i+1][j] then

if (people[i+1] or {})[j] then

你也可以明确地测试你是否在边境,但这很容易出错:

if j < n and people[i][j+1] then ....
if j > 0 and people[i][j-1] then ....
if i < n and people[i+1][j] then ....
if i > 0 and people[i-1][j] then ....

请注意,您显示的代码实际上只有第一个维度(i索引)的问题,因此只有这样做才有效:

if people[i][j+1] then ....
if people[i][j-1] then ....
if i < n and people[i+1][j] then ....
if i > 0 and people[i-1][j] then ....

另一个解决方案是在运行循环之前向people添加两个空数组:

people[-1] = {}
people[n+1] = {}

答案 1 :(得分:1)

使用模数运算符。

如果索引是从 0 n - 1 ,您可以使用:(x + 1) % n(x - 1 + n) % n分别找到下一个和前一个邻居。相反,如果索引来自 1 而不是 0 (到 n ),将一个 1 )添加到上述两个值中。

if people[i][(j + 1) % n] then ....
if people[i][(j - 1 + n) % n] then ....
if people[(i + 1) % n][j] then ....
if people[(i - 1 + n) % n][j] then ....

请注意,限制在这里发挥了重要作用。