天天看點

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

Z字形編排問題

背景:

JPEG(Joint Photographic ExpertsGroup)是一種常見的圖像檔案格式,也是目前靜态圖像中壓縮比最高的一種圖像檔案格式,它綜合運用了多種壓縮技術而達到一種極高的壓縮比例。JPEG是作為一個國際數字圖像壓縮标準,壓縮技術十分先進,它用有損壓縮方式去除備援的圖像和彩色資料,擷取得極高的壓縮率的同時能展現十分豐富生動的圖像。目前,它已被廣泛地應用與多媒體和網絡程式中。通常,在JEPG編碼過程中,有一個非常重要的步驟,即Z字形編排過程。Z字形編排過程大緻是這樣的:經過前期處理的圖像被分為若幹個 的小圖像塊,此時就從小圖像塊的左上角開始沿Z字形對圖像元素進行周遊,并将周遊所得的結果重新寫入等大小的圖像塊中。

經典Z字形編排問題的詳細解讀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,那麼周遊路徑在矩陣中的走向是水準向右移動一格;

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

2.如果二維數組中的元素中橫坐标是偶數,且縱坐标是0或Size-1,那麼周遊路徑在矩陣中的走向是垂直向下移動一格;

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

3.除以上外,如果橫縱坐标之和是偶數,則周遊路徑向右上角移動一格,如果是奇數,則周遊路徑向左下角移動一格;

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

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;
}