Arrays 二维阵列到一维阵列之字形排列算法

Arrays 二维阵列到一维阵列之字形排列算法,arrays,algorithm,multidimensional-array,Arrays,Algorithm,Multidimensional Array,我得到了一个8x8阵列,希望将其转换为一个包含64个字段的1d阵列。 但在这种特殊的曲折顺序中: 我想要聪明的方法,但我一点线索也没有。我有两种可能的理论,但它们并不聪明。有什么想法吗?有一个包含64个条目的数组,该数组按之字形模式访问索引的顺序保存索引。您可能会将它们用作某个缓冲区的偏移量。这是JPEG格式的,对吗 int[] zigzag = {0, 1, 8, 16, 9, 2, ... etc}; 拥有一个包含64个条目的数组,该数组按Z字形模式访问索引的顺序保存索引。您可能会将它们

我得到了一个8x8阵列,希望将其转换为一个包含64个字段的1d阵列。 但在这种特殊的曲折顺序中:


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

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

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

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

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

您可以尝试这样做:开始时,向右走一步,然后在唯一允许对角线的方向上进行对角线移动(首先是西南方向),然后一直循环到柱[0]。您向下移动1步(使用标志检查您之前是否向右移动了1步,并且您只能在该标志为真时向下移动;您可以将该标志更改为假并将向下标志更改为真),然后再次在唯一允许的方向(东北方向)上移动对角线,直到您到达第[0]行。这在AC[70]之前是可以的,因为没有向下移动。此时,将right和down的两个标志都重置为false并重新启动该过程。

您可以尝试这样做:开始时,向右侧迈出一步,然后朝唯一允许对角线的方向进行对角线移动(首先是西南方向),并一直循环到列[0]。您向下移动1步(使用标志检查您之前是否向右移动了1步,并且您只能在该标志为真时向下移动;您可以将该标志更改为假并将向下标志更改为真),然后再次在唯一允许的方向(东北方向)上移动对角线,直到您到达第[0]行。这在AC[70]之前是可以的,因为没有向下移动。此时,将right和down的两个标志都重置为false,然后重新启动该过程。

对于任何在谷歌搜索但找不到答案的人,这里有一个简单的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];
    }
}
for(我的$x=0;$x<$size;$x++){
对于(我的$y=0;$y<$size;$y++){
$OneArray[getPos($x,$y,$size)]=$TwoArray[$x][$y];
}
}

其中,
$OneArray
是您要将
$TwoArray
转换为的1D数组。

对于任何在谷歌搜索但找不到答案的人,这里有一个简单的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];
    }
}
for(我的$x=0;$x<$size;$x++){
对于(我的$y=0;$y<$size;$y++){
$OneArray[getPos($x,$y,$size)]=$TwoArray[$x][$y];
}
}


其中,
$OneArray
是您要将
$TwoArray
转换为的1D数组。

也许这会有所帮助。对于每一条对角线,索引的总和将是恒定的。方向翻转..应该能够与通用循环相匹配。不要根据封面来判断一本书。无论如何,如果你不想提出一些富有成效的想法,那么就避免这样的评论。“我有两种可能的理论,但它们并不聪明。”告诉我们吧!否则,可能有人会提出与您已有的解决方案相同的解决方案。也许这会有所帮助。对于每一条对角线,索引的总和将是恒定的。并且方向翻转。应该能够为此提供一个通用循环。不要根据封面来判断一本书。无论如何,如果你不想提出一些富有成效的想法,那么就避免这样的评论。“我有两种可能的理论,但它们并不聪明。”告诉我们吧!否则,有人可能会提出与您已有的解决方案相同的建议。这是我的想法之一,但我认为还有更明智的方法。是的,它是jpeg编码。这很公平,但你应该小心。你可能正在涉足专利领域。我见过的任何参考代码都使用这种方法,在现实世界中,这通常都是由硬件完成的。我想的是另一种方式。多谢各位@詹姆斯:这只是一个微不足道的PoC,它不会被使用或发布给公众。这是我的想法之一,但我认为有一个更聪明的方法。是的,它是jpeg编码。这很公平,但你应该小心。你可能正在涉足专利领域。我见过的任何参考代码都使用这种方法,在现实世界中,这通常都是由硬件完成的。我想的是另一种方式。多谢各位@詹姆斯:这只是一个微不足道的PoC,它不会被使用或发布给公众。这正是我的第二个想法,但我认为另一个更好,因为它在5分钟内完成,你可以通过google=)Thankstree找到索引数组,但另一个并不适用于所有数组。如果要对维度不是8 X 8的数组执行此操作,您会发现上面的方法更好。如果你关心的是速度,那么无论如何…@troll,这就是为什么你应该解释你已经抛弃的两种方式。这正是我的第二个想法,但我认为另一个更好,因为它在5分钟内完成,你可以通过google=)Thankstree找到索引数组,但另一个并不适用于所有数组。如果要对维度不是8 X 8的数组执行此操作,您会发现上面的方法更好。如果你关心的是速度,那么无论如何…@troll,这就是为什么你应该解释你已经抛弃的两种方式。你似乎浪费了别人的时间,因为他们张贴了你不接受的想法。