经典Z字形编排问题的详细解读

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;
}
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BugGuys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值