我试图操纵一个二维数组,以便我可以检查索引"旁边是"他们处于某种状态。如果我有一个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的状态将如何变化之前。知道我试图实现康威的生活游戏可能会有所帮助。有人告诉我这可以使用模数除法,但我不记得他们是怎么说的。我希望对算法进行一般性的讨论,而不是具体的实现。
答案 0 :(得分:0)
在康威的生命游戏中,宇宙环绕,所以与顶行相邻的正方形位于底部,与左边缘相邻的正方形位于右边缘,反之亦然。您可以使用N
之间的模除法来实现此环绕而无需条件。
具体来说,计算给定当前单元格的行或列的下一个单元格的行或列,您可以计算
int next = (current + 1) % N;
计算前一行或列有点棘手,因为从1
中减去0
会使您进入负数区域;你想避免这种情况。因此,您在模数除法之前添加N
,如下所示:
int prior = (current - 1 + N) % N;
这可确保结果不是负面的。
例如,如果N
为4
,则当前行为0,当前列为3,则四个相邻的单元格为
答案 1 :(得分:0)
假设您有一个2D数组state[N][N]
。我们需要检查state[i][j]
0 <= i < N
和0 <= 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
条件。