2011-08-15 93 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到一維數組。