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...