Z字形扫描

问题描述

在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:题目图示

对于下面的4×4的矩阵,

1 5 3 9

3 7 5 6

9 4 6 4

7 3 1 3

对其进行Z字形扫描后得到长度为16的序列:

1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3

请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。

输入格式

输入的第一行包含一个整数n,表示矩阵的大小。

输入的第二行到第n+1行每行包含n个正整数,由空格分隔,表示给定的矩阵。

输出格式

输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。

样例输入

4

1 5 3 9

3 7 5 6

9 4 6 4

7 3 1 3

样例输出

1 5 3 9 7 3 9 5 4
7 3 6 6 4 1 3

评测用例规模与约定

1≤n≤500,矩阵元素为不超过1000的正整数。
  
代码:

#include<stdio.h>
int main(){
    int n;
 scanf("%d",&n); 
 int sum=n*n;
 int order[sum];
 for(int l=0;l<sum;l++){
  order[l]=0;
 }
 int i=0;
 int j=0;//用于控制a的次序 
 int num=0;//控制在order中的次序 
 int a[n][n];
 for(int ii=0;ii<n;ii++){
  for(int jj=0;jj<n;jj++){
   scanf("%d",&a[ii][jj]);//赋值
  } 
 } 
 order[num]=a[i][j];
 num++;//将a[0][0]保存,i和j为上一次插入的下标
 /*将移动视为周期运动,一个周期运动包括:向右移动、向左下移动、向下移动、向右移动
 但应当注意的是,如果当前状态要向右移动,移动过后的列下标不应该超过n-1;否则应该改为向下移动;对于向下移动也是同理*/
 while(i!=(n-1)||j!=(n-1)){
  ++j;
  if(j>=n)
     {--j;++i;}
  order[num]=a[i][j];
     num++;
     while(i<n-1&&j!=0)
  {
   i++;
   j--;
   order[num]=a[i][j];
         num++; 
  }
  ++i;
  if(i>=n)
  {
   --i;
   ++j;  
  } 
  order[num]=a[i][j];
     num++;
     while(j<n-1&&i!=0)
     {
      j++;
      i--;
      order[num]=a[i][j];
         num++;   
  }  
 }
 for(int k=0;k<num;k++){
  printf("%d ",order[k]);
 } 
 return 0;
} 

输出
运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值