我得到了一个8x8数组,并希望将其转换为64字段的1d数组。 但在这个特殊的Z字形顺序:二维数组到一维数组算法与锯齿形的秩序
我想聪明的办法,但我没有线索。我有两种可能的理论,但他们不聪明。任何想法?
我得到了一个8x8数组,并希望将其转换为64字段的1d数组。 但在这个特殊的Z字形顺序:二维数组到一维数组算法与锯齿形的秩序
我想聪明的办法,但我没有线索。我有两种可能的理论,但他们不聪明。任何想法?
拥有一个64个条目的数组,它们按锯齿形模式访问它们的顺序保存索引。您可能会将它们用作某个缓冲区的偏移量。这是JPEG的东西吧?
int[] zigzag = {0, 1, 8, 16, 9, 2, ... etc};
你可以试试这个:当你开始,你拿1步到右侧,然后拿在允许对角线的唯一方向的对角线移动(在第一,这是西南),和所有环路直到列[0]的方式。你向下移动1步(用一个标志检查你以前是否向右移动了1步,如果此标志为真,则只能向下移动;可以将此标志更改为false并将down标志更改为true)并再次在唯一允许的方向(东北)取对角线,直到您碰到第[0]行。在AC [70]之前这样会好,因为没有下降。此时,将右侧和下侧的两个标志重置为false并重新启动该过程。
对于任何人的帮助谷歌搜索,无法找到答案,这里有一个简单的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
到一维数组。
我正要写一个答案,但看到你的用户名认为它可能不是我的时间的生产性用途... –
也许这将有助于..对于每条对角线,索引的总和将是常数..和方向翻转......应该能够用这个通用循环来构建。 – PeskyGnat
不要以封面来判断一本书。无论如何,如果你不想提供一些有生产力的想法,那么避免这样的评论。 – vo1d