具有锯齿形顺序的2D阵列到1D阵​​列算法

时间:2011-08-15 11:53:08

标签: arrays algorithm multidimensional-array

我有一个8x8阵列,并希望将其转换为具有64个字段的1d阵列。 但是在这个特殊的之字形顺序中:

enter image description here

我想要聪明的方式,但我没有线索。我有两种可能的理论,但它们并不聪明。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

拥有一个包含64个条目的数组,这些条目按照Z字形模式访问它们的顺序保存索引。您可能会将它们用作某些缓冲区的偏移量。这是JPEG的东西吗?

int[] zigzag = {0, 1, 8, 16, 9, 2, ... etc};

答案 1 :(得分:2)

你可以试试这个:当你开始时,你向右迈出一步,然后沿着允许对角线的唯一方向(首先是西南方向)进行对角线移动,并一直循环直到柱[0]。你向下移动1步(使用一个标志来检查你之前是否向前迈出了一步,如果此标志之前为真,你只能向下移动;你可以将此标志改为false并将向下标志更改为true)并再次沿唯一允许的方向(东北方向)采取对角线直到你遇到行[0]。这将很好,直到AC [70],因为没有向下移动。此时,将右侧和下侧的标志重置为false,然后重新启动该过程。

答案 2 :(得分:0)

在谷歌搜索的任何人的帮助下,找不到答案,这是我提出的一个简单的perl算法来解决问题。

sub getPos{
    my ($x,$y,$size)=@_;
    my $d = $x+$y;
    my $m = $d-$size;
    my $p = (($d%2)?$x:$y);
    my $dist = ($d*($d+1))/2;
    my $index = $dist + $p;
    if($d >= $size){
        $index -= ($m+1)**2;
    }
    return $index;
}

你这样使用它:

for(my $x = 0; $x < $size; $x++){
    for(my $y = 0; $y < $size; $y++){
        $OneArray[getPos($x, $y, $size)] = $TwoArray[$x][$y];
    }
}

$OneArray是您要将$TwoArray转换为。{/ p>的1D数组