2011-10-22 123 views
4

我有二维数组,并希望将其转换为一维数组。一维数组元素上的最近邻元素操作

二维数组是:

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

到一维数组:

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

如何访问元素数在一维数组的近邻,这样我可以得到同样的结果,当我访问二维数组,如

1 2 3 
5 6 7 
9 10 11 

在C++ ?

+1

用算术。旧索引'm [1] [2]'新索引'm [1 * 4 + 2]'。旧的最近邻居'[x-1] [y-1],[x] [y-1],x [x + 1] [y]'等等,new:'[(x-1)+ 4 *( Y-1)],[X + 4 *(Y-1)],[X + 1 + 4 *(Y-1)]'。将数组的宽度替换为4。 – user786653

+0

感谢它的工作。 – taker

+0

逻辑,如果你不介意阅读python代码,可以在[这里]找到(http://stackoverflow.com/a/41880018/5496529) –

回答

3

如果您有一个二维阵列,其长度为M项目长度为N项目高度,则需要一个具有M*N元素的一维阵列。

当试图找到元素x的邻居:

left(x) = (x - 1) % M 
right(x) = (x + 1) % M 
above(x) = (x - M) % (M * N) 
below(x) = (x + M) % (M * N) 

注意上面的解决方案使底部和相邻的阵列的顶部,以及右边缘和左边缘。为了摆脱这种情况,只需省略模块化数学运算并检测索引何时移过右/左/上/下边缘。

+0

我很抱歉,但我不明白你的解决方案。你会开导我吗? – taker

+0

如果您正在查看阵列位置'x',则左边的邻居位于'x-1'处。右边的邻居在'x + 1'处。你上面的邻居是'x-M'。你下面的邻居是'x + M'。这假设你的垂直轴随着你的下降而增加。如果你想减少,然后交换上面和下面的数学。 re是字面边缘案例 - 当你到达顶部,底部,左侧或右侧边缘时,你想如何处理邻居? – ObscureRobot