Modulo用于访问不同部分的二维数组

时间:2015-02-16 05:18:42

标签: arrays algorithm indexing modulo

我试图操纵一个二维数组,以便我可以检查索引"旁边是"他们处于某种状态。如果我有一个N x N网格,看起来像:

0 |1 |2 |3 |
4 |5 |6 |7 |
8 |9 |10|11|
12|13|14|15|

我想在决定如何更改索引0的状态之前检查索引4和1的状态。或者,如果我检查索引5,我将检查索引1,4,6和9在我决定索引5的状态将如何变化之前。知道我试图实现康威的生活游戏可能会有所帮助。有人告诉我这可以使用模数除法,但我不记得他们是怎么说的。我希望对算法进行一般性的讨论,而不是具体的实现。

2 个答案:

答案 0 :(得分:0)

在康威的生命游戏中,宇宙环绕,所以与顶行相邻的正方形位于底部,与左边缘相邻的正方形位于右边缘,反之亦然。您可以使用N之间的模除法来实现此环绕而无需条件。

具体来说,计算给定当前单元格的行或列的下一个单元格的行或列,您可以计算

int next = (current + 1) % N;

计算前一行或列有点棘手,因为从1中减去0会使您进入负数区域;你想避免这种情况。因此,您在模数除法之前添加N,如下所示:

int prior = (current - 1 + N) % N;

这可确保结果不是负面的。

例如,如果N4,则当前行为0,当前列为3,则四个相邻的单元格为

  • 之前,水平:((0-1 + 4)%4,3)=(3,3)
  • 接下来,横向:((0 + 1)%4,3)=(1,3)
  • 之前,垂直:(0,(3-1 + 4)%4)=(0,2)
  • 接下来,垂直:(0,(3 + 1)%4)=(0,0)

答案 1 :(得分:0)

假设您有一个2D数组state[N][N]。我们需要检查state[i][j] 0 <= i < N0 <= j < N附近的所有州。现在,假设由单个数字组成的索引表示的2D数组称为single[N*N]。假设temp是一个变量,其中的数组是2D数组的单个元素的类型。请注意,如果您使用单个数字而不是2来表示2D数组索引,那么如果数组以行主格式存储(如示例中所示),则i,j将对应于N*i + j。让m对应i,j。所以,我们在数组中的当前位置是single[m]。请注意,示例中的数组具有基于1的索引,而我在此处为基于0的索引编写。

int i = m / N;
int j = m % N;

对于i,j右侧的州:

if (j != N - 1)
    temp = single[m+1];

对于i,j左侧的州:

if (j > 0)
    temp = single[m-1];

状态到i,j的顶部:

if (i > 0)
     temp = single[m - N];

对于i,j以下的州:

if (i < N)
    temp = single[m + N];
编辑:我不熟悉康威的生活游戏,所以假设宇宙没有环绕。如果要包围Universe,则在temp语句之前删除所有if条件。