Z字形编排问题主要应用在JPEG编码上,也叫Zigzag。主要思路就是从左上角第一个像素开始以Z字形进行编排。
最后得到如下图的矩阵:
在左飞的《算法之美—隐匿在数据结构背后的原理》中有对Z字形编码的算法实现。
其实现比较复杂,主要思路是定义了两个二维数组;一个二维数组用来存正常的顺序,一个二维数组用来存Zigzag编排之后的顺序,最后用了两个for循环进行遍历。
我的实现如下:
#include <iostream>
#include <iomanip>
using namespace std;
#define ARRSIZE 8
int main()
{
int matrix[ARRSIZE][ARRSIZE] = {0};
int temp = 0;
int i=0, j=0;
for (int x=0; x < ARRSIZE*ARRSIZE; x++)
{
if((i == 0 || i==ARRSIZE -1) && j%2 == 0)
{
j++;
}
else if((j == 0 || j==ARRSIZE-1) && i%2 == 1)
{
i++;
}
else if ((i+j)%2 == 1)
{
i++;
j--;
}
else if((i+j)%2 == 0)
{
i--;
j++;
}
temp = temp+1;
matrix[i][j] = temp;
}
// 打印二维数组
for (int i=0; i < ARRSIZE; i++)
{
for (int j=0; j < ARRSIZE; j++)
{
cout << setw(4) << matrix[i][j]<< " " ;
}
cout << endl;
}
system("pause");
return 0;
}
编排过程中只用到了一次for循环,只用到了一个二维数组,在时间和空间上都有所优化。
主要思路如下:
1. 左边的格子跳到右边的格子,只能在第一行或最后一行进行,且此时纵坐标为偶数;
2. 从上边的格子跳到下边的格子,只能在第一列或最后一列,且此时横坐标为奇数;
3. 从右上到左下,横纵坐标之和为奇数;
4. 从左下到右上,横纵坐标之和为偶数;
5. 这四个条件每次只能有一个满足(else if), 满足之后就跳一格(temp+1)。
结果也是一样的: