Z字形编排问题(Zigzag)的一种更简单的实现

Z字形编排问题主要应用在JPEG编码上,也叫Zigzag。主要思路就是从左上角第一个像素开始以Z字形进行编排。
《Z字形编排问题(Zigzag)的一种更简单的实现》
最后得到如下图的矩阵:
《Z字形编排问题(Zigzag)的一种更简单的实现》
在左飞的《算法之美—隐匿在数据结构背后的原理》中有对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)。

结果也是一样的:

《Z字形编排问题(Zigzag)的一种更简单的实现》

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/PinkFriday/article/details/78275214
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞