Z字形編排問題(Zigzag)的一種更簡單的實現

2021-08-09 12:08:48 字數 1294 閱讀 5179

z字形編排問題主要應用在jpeg編碼上,也叫zigzag。主要思路就是從左上角第乙個畫素開始以z字形進行編排。

最後得到如下圖的矩陣:

在左飛的《演算法之美—隱匿在資料結構背後的原理》中有對z字形編碼的演算法實現。

其實現比較複雜,主要思路是定義了兩個二維陣列;乙個二維陣列用來存正常的順序,乙個二維陣列用來存zigzag編排之後的順序,最後用了兩個for迴圈進行遍歷。

我的實現如下:

#include 

#include

using

namespace

std;

#define arrsize 8

int main()

; int temp = 0;

int i=0, j=0;

for (int x=0; x < arrsize*arrsize; x++)

else

if((j == 0 || j==arrsize-1) && i%2 == 1)

else

if ((i+j)%2 == 1)

else

if((i+j)%2 == 0)

temp = temp+1;

matrix[i][j] = temp;

}

// 列印二維陣列

for (int i=0; i < arrsize; i++)

cout

<< endl;

}system("pause");

return

0;}

編排過程中只用到了一次for迴圈,只用到了乙個二維陣列,在時間和空間上都有所優化。

主要思路如下:

1. 左邊的格仔跳到右邊的格仔,只能在第一行或最後一行進行,且此時縱座標為偶數;

2. 從上邊的格仔跳到下邊的格仔,只能在第一列或最後一列,且此時橫座標為奇數;

3. 從右上到左下,橫縱座標之和為奇數;

4. 從左下到右上,橫縱座標之和為偶數;

5. 這四個條件每次只能有乙個滿足(else if), 滿足之後就跳一格(temp+1)。

結果也是一樣的:

Z字形考場編排演算法

在大型考試中學生的座號一般按6 5 z字形編排。如下圖 1 12 13 24 25 2 11 14 23 26 3 10 15 22 27 4 9 16 21 28 5 8 17 20 29 6 7 18 19 30 使用程式如何實現呢?看似毫無頭緒,怎麼辦呢?先看看這樣的排列如何實現 1 7 13...

經典Z字形編排問題的詳細解讀

正常8x8矩陣 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50...

陣列相關 4 4陣列轉置 z字形編排

4 4陣列轉置 includeusing namespace std int main int argc,char argv int i 0 int j 0 int tmp 0 for i 0 i 4 i j i 1 for i 0 i 4 i int i 0 int j 0 const int t...