问题描述
  在图像编码的算法中,需要将一个给定的方形矩阵进行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的正整数。


分析这类题,首先要找出扫描的规律,从题目中可以发现,扫描是成Z字形的。那么也就是说对于扫描输出有四种状态,每次输出要判定下一次的行走路线,走一步就输出一个。

四种状态为{right,leftDown,down,rightUp}。

开始我还怀疑,Z字形扫描矩阵是否能够遍历矩阵所有的元素。下面我们来分析一下:

1、前提是这个矩阵是一个n维方阵,假设为Anxn.

2、从输出当前的元素A[i][j],并根据当前的状态来判断下一步的扫描状态。该如何判断呢?可以发现每次在执行完当前状态后,行号i或者列号j都有可能发生改变,那么就可以结合当前状态和行,列号的取值来判定下一步的行走路线。

从上图中我们可以发现:

right状态始终在首行或者尾行上执行,并且执行right状态后列号j会增加1,即j = j+1。所以我们可以根据当前状态的下一步状态有两种:

当i == 0时,state = leftDown;

当i == n-1时,state = rightUp。

执行完leftDown状态后,i = i+1,j = j-1,其下一步状态有三种:

当 j == 0 && i != n-1时,state = down;

当 row == n-1时,state = right;

其它情况,state = leftDown(自身状态)。

对于rightUp和down状态,其分析方法和上面两种类似,就不再做分析。

综合上面分析来看,状态每次要发生改变的话,行号或者列号必须处于临界状态,即它们的取值为{0,n-1}。


给出代码:

#include <iostream>

using namespace std;

int A[][];
enum Choice
{
rightTowards,//向移动
rightUp,//向右上移动
down,//向下移动
leftDown//向左下移动
}; void zigzagScan(int n)
{
for (int i = ; i < n; ++i)
for (int j = ; j < n; ++j)
cin >> A[i][j];
int row = , col = ;
Choice choice = rightTowards;
//row = n-1&&col = n-1的情况在while循环结束后处理,防止出现越界的情况
while (row != n - || col != n - )
{
cout << A[row][col] << ' ';
switch (choice)
{
case rightTowards:
col++;
if (row == )
choice = leftDown;
else
choice = rightUp;
break;
case rightUp:
row--;
col++;
if (row == && col != n - )
choice = rightTowards;
else if (col == n - )
choice = down;
else
choice = rightUp;
break;
case down:
row++;
if (col == )
choice = rightUp;
else
choice = leftDown;
break;
case leftDown:
row++;
col--;
if (col == && row != n - )
choice = down;
else if (row == n - )
choice = rightTowards;
else
choice = leftDown;
break;
}
}
cout << A[n - ][n - ];
} void main(void)
{
int n;
while (cin >> n)
{
zigzagScan(n);
}
}

Z字形扫描矩阵的更多相关文章

  1. Z字形扫描(201412-2)

    问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 ...

  2. CCF——Z字形扫描问题

    试题编号: 201412-2 试题名称: Z字形扫描 时间限制: 2.0s 内存限制: 256.0MB 问题描述: 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag ...

  3. [CCF] Z字形扫描

    CCF Z字形扫描 感觉和LeetCode中的ZigZag还是有一些不一样的. 题目描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z ...

  4. CCF真题之Z字形扫描

    201412-2 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 ...

  5. CCF系列之Z字形扫描(201412-2)

    试题编号:201412-2试题名称:Z字形扫描时间限制: 2.0s内存限制: 256.0MB 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n ...

  6. CCF CSP 201412-2 Z字形扫描

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201412-2 Z字形扫描 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫 ...

  7. CSP201412-2:Z字形扫描

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  8. 201412-2 Z字形扫描(c语言)

    问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 ...

  9. CCF201412-2 Z字形扫描 java(100分)

    试题编号: 201412-2 试题名称: Z字形扫描 时间限制: 2.0s 内存限制: 256.0MB 问题描述: 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag ...

随机推荐

  1. 使用命令行工具mysqlimport导入数据

    Usage: mysqlimport [OPTIONS] database textfile ... mysqlimport 程序是一个将以特定格式存放的文本数据(如通过“select * into ...

  2. CentOS使用EPEL YUM源

    刚刚开始学习centos,感觉很不适应,因为好多软件,yum里面居然没有,让我很不爽,一阵狂搜. 原来centos还有一个epel源,果然,不熟悉的东东,处处是坑啊! EPEL (Extra Pack ...

  3. putty设置用key自动登录

    1.在Linux下ssh-keygen -t rsa 生成密钥对 2.把私钥id_isa下载到用scp下载到windows并用puttygen加载并重新保存私钥. 3.在windows下新建快捷方式, ...

  4. PHP遍历目录返回统计目录大小实例

    分享一个 PHP遍历目录并返回统计目录大小的方法.代码: <?php $dirname = "test1"; //mkdir($dirname); //遍历一层目录 func ...

  5. CentOS防火墙开启、关闭与开放指定端口

    系统为centos 5.5,部署好Tomcat之后却发现输入114.80.*.*:8080(即ip:8080)却无法显示Tomcat默认的首页.由于以前部署在Win Server的VPS上,Linux ...

  6. C#特性Attribute学习

    起初一直纠结于如何调用特性附着在下面那个成员的值,后来发现不需要调用,通过反射加载的时候是自动绑定上去的,即 获得成员对象之后,有一个方法可以获得特性标签. 其实从类库提供者,和类库使用者的角度,分开 ...

  7. java.net.Socket/java.net.ServerSocket-TCP Socket编程

    TCP 的 Java 支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP 协议族有 IP 协议.TCP 协议和 ...

  8. mysql5.7启动slave报错 ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

    原因:检查my.cnf,原来没指定relay_log,mysql默认产生的relay_log名被该server上的另一个mysql slave占用了. 解决方法:1.在my.cnf中添加 relay_ ...

  9. php下载图片到本地

    写了一天,就写了这么点代码,凑合用吧. #saveImage.php<?php /** * 图片下载方法,提供两种图片保存方式: * 1.按照图片自带的名称保存 * 2.按照自定义文件名保存 * ...

  10. VBA 删除页

    怎么让word自动删除第3.6.9.12等3的倍数页‘ Sub kk1206190933() Dim wNum As Integer Dim wPag As Integer With Selectio ...