CCF CSP真题讲解--Z字形扫描

CCF CSP真题讲解--Z字形扫描

题目描述

试题编号: 201412-2
试题名称: Z字形扫描
时间限制: 2.0s
内存限制: 256.0MB
问题描述
  在图像编码的算法中,需要将一个给定的方形矩阵进行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的正整数。

解题思路

  1. 扫描从左上角出发,首先是右拐,接下来扫描的顺序是: 沿左下移动 --> 拐弯 --> 沿右上移动 --> 拐弯 --> 沿左下移动 -->… (不断重复)。什么时候要拐弯?答案是当移动到矩阵边界的时候。
  2. 拐弯有两种,一是向右,二是向下。什么时候向右?答案是移动到矩阵顶部或底部的时候。什么时候向下?答案是移动到矩阵左边界或右边界的时候。特别注意,移动到右上角元素的时候,要向下拐弯。移动到左下角元素的时候,要向右拐弯。

代码

def turn(row, column, n_size):
'''拐弯的处理'''
    if row == n_size - 1:   #已到达底部
        column += 1
    elif column == n_size - 1:  #已到达右边界
        row += 1
    elif row == 0:    #已到达顶部(须放在‘已到达右边界’之后)
        column += 1
    elif column == 0:  #已到达左边界(须放在‘已到达底部’之后)
        row += 1
    return (row, column)

def move_left_down(row, column, n_size):
'''向左下移动一格。到达边界的话,则拐弯。'''
    if column == 0 or row == n_size - 1:
        row, column = turn(row, column, n_size)
        return (row, column, 1)
    else:
        row += 1
        column -= 1
        return (row, column, 0)

def move_right_up(row, column, n_size):
'''向左上移动一格。到达边界的话,则拐弯。'''
    if row == 0 or column == n_size - 1:
        row, column = turn(row, column, n_size)
        return (row, column, 0)
    else:
        row -= 1
        column += 1
        return (row, column, 1)

#输入矩阵
n = int(input())
n_mtx = []
for i in range(n):
    n_line = [int(s) for s in input().split()]
    n_mtx.append(n_line)
# print(n_mtx)

#打印左上角元素
print(n_mtx[0][0], end = ' ')
row = 0
column = 1    
move_index = 0  #0: left_down, 1: right_up。 
 #依次打印扫描到的元素
while row < n and column < n:
    print(n_mtx[row][column], end = ' ')  
    if move_index == 0:              #0与1交替,决定了扫描移动的方向
        row, column, move_index = move_left_down(row, column, n)
    else:
        row, column, move_index = move_right_up(row, column, n)

测试用例

  1. n为偶数的情形。比如4x4的矩阵。
  2. n为奇数的情形。比如5x5的矩阵。
  3. n为1的情形。不要忘了这种极端情形。
发布了85 篇原创文章 · 获赞 86 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/yedouble/article/details/83026916