CCFCSP认证 历年题目自练Day7
试题编号: 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的正整数。
s=[]
for i in range(n):
s+=[list(map(int,input().split()))]
x=0;y=0#x是行y是列
def Z(x,y,number,bl):#斜向移动函数 bl=1从右上往左下bl=-1从左下到右上
for i in range(number):
x=x+bl
y=y-bl
l.append(s[x][y])
bl=-bl
return x,y,bl
n=int(input())
s=[]
for i in range(n):
s+=[list(map(int,input().split()))]
bl=1
l=[s[0][0]]
x=0;y=0#x是行y是列
def Z(x,y,number,bl):#斜向移动函数 bl=1从右上往左下bl=-1从左下到右上
for i in range(number):
x=x+bl
y=y-bl
l.append(s[x][y])
bl=-bl
return x,y,bl
for i in range(n-1):#循环结束移动到[0,n-1]#左下角
if bl==1:
y+=1
else:
x+=1
l.append(s[x][y])
x,y,bl=Z(x,y,i+1,bl)
for i in range(n-2):#剩下移动
if bl==-1:
y+=1
else:
x+=1
l.append(s[x][y])
x,y,bl=Z(x,y,n-i-2,bl)
l.append(s[n-1][n-1])#加上最后一点
print(l[0],end='')
for i in range(1,n*n):
print('',l[i],end='')
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 = ' ')
max_xplusy = n - 1 + n - 1 #横坐标+纵坐标之和的最大值,也是右下角元素的横坐标+纵坐标之和
#沿斜线迭代n*n方阵mtx的元素,这些元素的横坐标+纵坐标=t
def itr(mtx, n, t):
start = min(n-1, t)
if t % 2 == 0: #偶数,斜向上遍历
for x in range(start, t - start - 1, -1):
print(mtx[x][t-x], end = ' ')
else: #t为奇数,斜向下遍历
for y in range(start, t - start - 1, -1):
print(mtx[t-y][y], end = ' ')
for t in range(1, max_xplusy + 1):
#遍历斜线上的元素
itr(n_mtx, n, t)