这是第三次CCF计算机软件能力认证考试(2014年12月14日)的一道题目。小编今天有幸免费参加了这次考试。据说这题是谷歌的笔试题变形??求证实。。

好了,题外话不啰嗦,看题目

题目

在图像编码的算法中,需要将一个给定的方形矩阵进行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字形扫描,网上不少高手有先进的解法。这里我就不多说了。大家可以去百度或者谷歌。

我在这里分享下我考试时想到的比较直接的解法,略显笨拙。记得题目给的运算时间和运行空间还是比较宽松的。

在CCF认证考试的五道题里面,该题排在第二的位置,显然难度不是很大的,不宜恋战,应当速战速决。

考试当时想到的第一步就是看图找规律。发现矩阵Z字形扫描从(0,0)位置开始,前进的方向有4个,分别是右、下,左下、右上。不难看出,Z字形扫描向右、向下两个方向,只前进一步就会变向,改变后的方向因情况而异;而左下和右上两个方向则会一直延伸,直至前面无法继续直行时再变向为向右或者向下。

然而值得注意的时:

1.左下方向因无法继续直行需要变向时,要先判断是否能往下走,若不能往下走再往右走;

2.右上方向因无法继续直行需要变向时,要先判断是否能往右走,若不能往右走再往下走。

到这里可以总结出:下一步的方向,由上一步的方向以及周围的情况(是否临界)决定。

想到这些,我就想模拟一个人在(0,0)这个位置出发,沿题目要求的路径走到(n-1,n-1)的位置。由于下一步的方向需要上一步的方向来参与决策,因此需要引入一个方向变量direction,分别用值1,2,3,4代表4个方向:右,下,左下,右上。编程的时候可以分解为两个步骤:

1.根据上一步的方向以及是否到达边界位置来决定下一步方向;

2.根据步骤1得到的方向前进一步,读取该位置的数字。

循环直至到达终点(n-1, n-1)

说到这里,相信看下面的代码就能看懂了(为了更容易看懂一些,有一部分代码可以简化的没有简化)

代码

(CCF认证考试对JAVA语言答题的要求:1.程序入口为Main类的main方法;2.不能有package;3.输入System.in,输出System.out)

import java.util.Scanner;

public class Main {

//下面四个变量代表四个方向

public static final int RIGHT = 1;//向右走

public static final int DOWN = 2;//向下走

public static final int LEFTDOWN = 3;//向做下走

public static final int RIGHTUP = 4;//向右上走

public static int data[][];            //矩阵

public static void main(String[] args) {

new Main().run();

}

public static void run(){

//接收输入

Scanner scanner = new Scanner(System.in);

int n = scanner.nextInt();

data = new int[n][n];

for(int i = 0; i

for(int j = 0; j

data[i][j] = scanner.nextInt();

}

}

//从第一个位置开始,x为横坐标,y为纵坐标,注意x,y在二维数组中的位置

int x = 0;

int y = 0;

//输出要求有空格隔开

String result = data[y][x] + " ";

//方向变量的初始值

int direction = 0;

//下面就开始出发走咯

while( !(x == n-1 && y == n-1) ){//循环直至到达终点(最右下角的位置)

//先判断下一步往哪个方向走

if(direction == 0){//为0说明还没走出第一步,所以接着应该往右边走一步

direction = RIGHT;

} else if(direction == RIGHT){ //上一次方向向右,下一步应该向左下或者右上

if(x-1 >= 0 && y+1

direction = LEFTDOWN;

} else {//只能走右上了

direction = RIGHTUP;

}

} else if(direction == DOWN){//上一次方向向下,下一步应该向左下或者右上

if(x-1 >= 0 && y+1

direction = LEFTDOWN;

} else {//只能走右上了

direction = RIGHTUP;

}

} else if(direction == LEFTDOWN){//上一次向左下,如果可以,下一步应该继续向左下,否则 向右或者向下走

if(y+1 = 0){//先判断能否继续向左下

direction = LEFTDOWN;

} else if(y+1

direction = DOWN;

} else {//最后只能向右走了

direction = RIGHT;

}

} else if(direction == RIGHTUP){//上一次向右上,如果可以,下一步应该继续向右上,否则向右或者下走

if(x+1 =0){//先判断能否继续向右上

direction = RIGHTUP;

} else if(x+1

direction = RIGHT;

} else{//最后只能向下走了

direction = DOWN;

}

}

//根据上面确定的方向来走出下一步

switch(direction){

case RIGHT: x = x+1; break;

case DOWN: y = y+1; break;

case LEFTDOWN: x = x-1; y = y+1; break;

case RIGHTUP: x = x+1; y = y-1; break;

}

//读取当前走到位置的数字.注意x和y的位置

result += data[y][x] + " ";

}

//输出结果(这里需不需要去掉最后的空格?没怎么玩过ACM,不记得了acc格式控制会不会这么严)

System.out.println(result);

}

}

From:陈祖煌

转载必须说明出处

--------------------------------------------------------------------------------------

ccf z字形 java_第三次CCF计算机软件能力认证题目:Z字形扫描相关推荐

  1. [ 2019-12-15第十八次CCF计算机软件能力认证]总结 Apare_xzc

    [ 2019-12-15第十八次CCF计算机软件能力认证]总结 导言:今天第一次参加CCF考试,考完回来迫不及待地想要做一点笔记 链接:我做的CCF题目汇总Apare_xzc <– 比赛题目(凭 ...

  2. CCF计算机软件能力认证202009-1称检测点查询(C语言版)

    ccf-csp计算机软件能力认证202009-1称检测点查询(C语言版) 题目内容: 题目背景 2020 年 6 月 8 日,国务院联防联控机制发布<关于加快推进新冠病毒核酸检测的实施意见> ...

  3. CCF计算机软件能力认证试题练习:201903-1 小中大

    小中大 来源:CCF 标签: 参考资料: 相似题目: 背景 在数据分析中,最小值最大值以及中位数是常用的统计信息. 题目 老师给了你 n 个整数组成的测量数据,保证有序(可能为升序或降序),可能存在重 ...

  4. CCF计算机软件能力认证试题练习:201803-2 碰撞的小球

    碰撞的小球 来源:CCF 标签: 参考资料: 相似题目: 题目 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上, ...

  5. CCF计算机软件能力认证试题练习:201809-2 买菜

    买菜 来源:CCF 标签: 参考资料: 相似题目: 题目 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装 ...

  6. CCF计算机软件能力认证试题练习:201909-2 小明种苹果(续)

    小明种苹果(续) 来源:CCF 标签: 参考资料: 相似题目: 题目 小明在他的果园里种了一些苹果树,这些苹果树排列成一个圆.为了保证苹果的品质,在种植过程中要进行疏果操作.为了更及时地完成疏果操作, ...

  7. CCF计算机软件能力认证试题练习:201803-4 棋局评估

    棋局评估 来源:CCF 标签: 参考资料: 相似题目: 题目 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X", ...

  8. CCF计算机软件能力认证试题练习:201912-3 化学方程式

    化学方程式 来源:CCF 标签: 参考资料: 相似题目: 题目 化学方程式,也称为化学反应方程式,是用化学式表示化学反应的式子.给出一组化学方程式,请你编写程序判断每个方程式是否配平(也就是方程式中等 ...

  9. 第一次CCF计算机软件能力认证

    感受: 又是收获满满(啥也不会 )的一套题呢 _(xз」∠)_ 感觉自己的效率不高,没能按照目标做到一天一套题目加解析. 主要是因为刷题太少导致对常用函数不熟悉.经典思路没见过,所以做题慢,希望后面能 ...

最新文章

  1. Electron:新一代基于Web的跨平台桌面技术
  2. texstudio如何安装cjk宏包_MikTex+TexStudio配置论文写作环境
  3. git如何查看和切换账号
  4. New Relic——手机应用app开发达人的福利立即就到啦!
  5. 【Oracle】恢复临时表空间数据文件
  6. SQL经典面试50题 | 附答案
  7. Essential Netty in Action 《Netty 实战(精髓)》
  8. C++ 中三角函数:sin,cos,asin,acos等
  9. Spring Cloud学习笔记(二)Restful理解及微服务的Restful调用
  10. python 隐马尔可夫模型的中文分词和词性分类实验 hmm
  11. pearson相关性
  12. 公共DNS服务器IP地址
  13. 浅谈Linux PMIC驱动(一)
  14. 磕技术、筑平台,浪潮存储如何持续破局?
  15. 第2章第7节:标题设计技巧:实现字叠字的创意艺术效果 [PowerPoint精美幻灯片实战教程]
  16. js删除json中指定的元素
  17. 【开源工程】STM32C8T6+ADC信号采集+OLED波形显示
  18. Proteus 8 Professional跑Keil uVision4的文件
  19. 蹩脚的CSDN手机绑定
  20. 链表的定义及使用 综合实战:超市购物车

热门文章

  1. 图像分割2020总结:结构,损失函数,数据集和框架
  2. 论文简述 | EAO-SLAM:基于集成数据关联的单目半稠密物体级SLAM
  3. OpenCV 4.5发布!更强的SIFT,OCR,RANSAC算法,新增目标跟踪网络SiamRPN++
  4. CVPR 2020 | 将深度学习算法应用于移动端最新研究汇总
  5. PCL从0到1|点云滤波之直通滤波与体素法滤波
  6. html编写的过程中,为什么font设置属性的时候,第二个属性不起作用
  7. 第二十九课.回声状态网络ESN
  8. redis一般缓存什么样数据_门户数据展示_Redis缓存数据
  9. 推荐2个命令快速在本地和服务器之间上传下载文件
  10. Microbiome:应用多维宏组学方法协同揭示复杂细菌群落对目标底物代谢的菌间相互关系(一作解读)...