Z字形編排問題
背景:
JPEG(Joint Photographic ExpertsGroup)是一種常見的圖像檔案格式,也是目前靜态圖像中壓縮比最高的一種圖像檔案格式,它綜合運用了多種壓縮技術而達到一種極高的壓縮比例。JPEG是作為一個國際數字圖像壓縮标準,壓縮技術十分先進,它用有損壓縮方式去除備援的圖像和彩色資料,擷取得極高的壓縮率的同時能展現十分豐富生動的圖像。目前,它已被廣泛地應用與多媒體和網絡程式中。通常,在JEPG編碼過程中,有一個非常重要的步驟,即Z字形編排過程。Z字形編排過程大緻是這樣的:經過前期處理的圖像被分為若幹個 的小圖像塊,此時就從小圖像塊的左上角開始沿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 51 52 53 54 55 56 57 58 59 60 61 62 63
Z字形排序8x8矩陣:
0 1 5 6 14 15 27 28 2 4 7 13 16 26 29 42 3 8 12 17 25 30 41 43 9 11 18 24 31 40 44 53 10 19 23 32 39 45 52 54 20 22 33 38 46 51 55 60 21 34 37 47 50 56 59 61 35 36 48 49 57 58 62 63
通過對原始矩陣的分析可得出如下三種規律:
1.如果二維數組中的元素中縱坐标是偶數,且橫坐标是0或Size-1,那麼周遊路徑在矩陣中的走向是水準向右移動一格;
2.如果二維數組中的元素中橫坐标是偶數,且縱坐标是0或Size-1,那麼周遊路徑在矩陣中的走向是垂直向下移動一格;
3.除以上外,如果橫縱坐标之和是偶數,則周遊路徑向右上角移動一格,如果是奇數,則周遊路徑向左下角移動一格;
C++代碼如下:
#include <iostream>
#include <iomanip>
using namespace std;
#define SIZE 8
int main()
{
int matrix[SIZE][SIZE] = {0};
int dst[SIZE][SIZE] = {0};
int i, j, x, y, values = 0;
//初始化矩陣并列印
for(i = 0,values = 0; i<SIZE; i++)
{
for(j = 0; j<SIZE; j++)
{
matrix[i][j] = values++;
cout<<setw(4)<<matrix[i][j];
}
cout<<endl;
}
//Z字形排序
for(x = 0, i = 0, j = 0; x < SIZE; x++)
{
for(y = 0; y <SIZE; y++)
{
dst[i][j] = matrix[x][y];
//1.如果二維數組中的元素中縱坐标是偶數,且橫坐标是0或Size-1,那麼周遊路徑在矩陣中的走向是水準向右移動一格;
if((i == 0 || i == SIZE-1) && j%2==0)
{
j++;
continue;
}
//2.如果二維數組中的元素中橫坐标是偶數,且縱坐标是0或Size-1,那麼周遊路徑在矩陣中的走向是垂直向下移動一格;
if((j == 0 || j == SIZE-1) && i%2!=0)
{
i++;
continue;
}
//3.如果橫縱坐标之和是偶數,則周遊路徑向右上角移動一格;
if((i+j)%2 == 0)
{
i--;
j++;
continue;
}
//4.如果是奇數,則周遊路徑向左下角移動一格;
else if((i+j)%2 == 1)
{
i++;
j--;
continue;
}
}
}
//列印目标矩陣
for(i = 0; i<SIZE; i++)
{
for(j = 0; j<SIZE; j++)
{
cout<<setw(4)<<dst[i][j];
}
cout<<endl;
}
return 0;
}