Z字型编排问题

JPEG(Joint Photographic ExpertsGroup)是一种常见的图像文件格式,也是目前静态图像中压缩比最高的一种图像文件格式,它综合运用了多种压缩技术而达到一种极高的压缩比例。JPEG是作为一个国际数字图像压缩标准,压缩技术十分先进,它用有损压缩方式去除冗余的图像和彩色数据,获取得极高的压缩率的同时能展现十分丰富生动的图像。目前,它已被广泛地应用与多媒体和网络程序中。通常,在JEPG编码过程中,有一个非常重要的步骤,即Z字形编排过程。Z字形编排过程大致是这样的:经过前期处理的图像被分为若干个 的小图像块,此时就从小图像块的左上角开始沿Z字形对图像元素进行遍历,并将遍历所得的结果重新写入等大小的图像块中,整个过程如图2-15所示。

《Z字型编排问题》

要实现这样一个Z字形排列可能读者咋一看会感觉无从下手。但是在分析了Z字形遍历原矩阵过程中的走向规律,其实可以设计一个非常简单的算法来实现这种编排。对于原始矩阵matrix中的任意元素matrix[i][j]的遍历走向规律可以分为如下三种情况

  • 如果二维数组中的元素matrix[i][j]中纵坐标j是偶数,且i=0或者i=7,那么遍历路径在矩阵中的走向就是水平向右移动一格。
  • 如果二维数组中的元素matrix[i][j]中纵坐标i是奇数,且j=0或者j=7,,那么遍历路径在矩阵中的走向就是垂直向下移动一格。
  • 除上述规则以外的情况,如果二维数组中的元素matrix[i][j]的横纵坐标和i+j是偶数,则遍历路径在矩阵中的走向就是右上角移动一格;否则,若i+j是奇数,则遍历路径在矩阵中的走向就是左下角移动一格。
#include <bits/stdc++.h>
using namespace std;
int ans[8][8];
int a[8][8];
int main(){
  int n;
  cin>>n;
  memset(ans,0,sizeof(ans));
  int *p;
  p=&ans[0][0];
  for(int i=0;i<n*n;i++)
    *p++=i;
  for(int i=0;i<n;i++)
  {
      for(int j=0;j<n;j++)
        cout<<setw(4)<<ans[i][j];
        cout<<endl;
  }
  int x=0,y=0;
  for(int i=0;i<n;i++)
  {
      for(int j=0;j<n;j++)
      {
          a[x][y]=ans[i][j];
          if((x==n-1||x==0)&&y%2==0)
          {
              y++;
              continue;
          }
          else if((y==0||y==n-1)&&x%2==1)
          {
              x++;
              continue;
          }
          if((x+y)%2==0)
          {
              x--;
              y++;
          }
          else if((x+y)%2==1)
          {
              x++;
              y--;
          }
      }
  }
  for(int i=0;i<n;i++)
  {
      for(int j=0;j<n;j++)
        cout<<setw(4)<<a[i][j];
        cout<<endl;
  }


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