2011-08-15 57 views
0

我得到了一个8x8数组,并希望将其转换为64字段的1d数组。 但在这个特殊的Z字形顺序:二维数组到一维数组算法与锯齿形的秩序

enter image description here

我想聪明的办法,但我没有线索。我有两种可能的理论,但他们不聪明。任何想法?

+6

我正要写一个答案,但看到你的用户名认为它可能不是我的时间的生产性用途... –

+1

也许这将有助于..对于每条对角线,索引的总和将是常数..和方向翻转......应该能够用这个通用循环来构建。 – PeskyGnat

+0

不要以封面来判断一本书。无论如何,如果你不想提供一些有生产力的想法,那么避免这样的评论。 – vo1d

回答

3

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

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

这是我的想法之一,但我认为有一个更聪明的方法。是的,这是JPEG编码。 – vo1d

+0

够公平,但你应该小心。你可能会将脚趾头浸入专利世界。我见过的任何参考代码都使用这种方法,在现实世界中,这通常都是由硬件完成的。 – James

+0

编辑之后的评论:这比我的两个想法好得多。我在想另一种方式。非常感谢你。 @詹姆斯:这只是一个简单的PoC,它不会被使用或向公众发布。 – vo1d

2

你可以试试这个:当你开始,你拿1步到右侧,然后拿在允许对角线的唯一方向的对角线移动(在第一,这是西南),和所有环路直到列[0]的方式。你向下移动1步(用一个标志检查你以前是否向右移动了1步,如果此标志为真,则只能向下移动;可以将此标志更改为false并将down标志更改为true)并再次在唯一允许的方向(东北)取对角线,直到您碰到第[0]行。在AC [70]之前这样会好,因为没有下降。此时,将右侧和下侧的两个标志重置为false并重新启动该过程。

+1

这正是我的第二个想法,但另一个在我看来更好,因为它在5分钟内完成,你可以通过谷歌找到指数数组= =谢谢 – vo1d

+0

真实,但另一个不推广所有数组。你会发现上面的方法更好,如果你想要这样做的话,对于尺寸不是8X的数组,8.如果速度是你关心的,那么通过一切手段...... –

+1

@troll,这就是为什么你应该解释你已经抛出的两种方式。看起来你浪费了别人的时间,因为他们发布了你已经解雇的想法。 – Paul

0

对于任何人的帮助谷歌搜索,无法找到答案,这里有一个简单的Perl算法,我想出来解决这个问题。

sub getPos{ 
    my ($x,$y,$size)[email protected]_; 
    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到一维数组。