201412-2 Z字形扫描
2019-12-16 本文已影响0人
月影追猎者
试题编号:201412-2
试题名称:Z字形扫描
时间限制:2.0 s
内存限制:256.0 MB
问题描述:
在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:
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
Java实现
import java.util.Scanner;
public class ZigzagScan {
public static void main(String[] args) {
int num = new Scanner(System.in).nextInt();
int[][] matrix = new int[num][num];
for (int i = 0; i < num; i++) {
String str = new Scanner(System.in).nextLine();
String[] arr = str.split(" ");
for (int j = 0; j < num; j++) {
matrix[i][j] = Integer.parseInt(arr[j]);
}
}
for (int i = 0; i < 2 * num - 1; i++) {
int start = i < num ? 0 : (i - num + 1);
int end = i < num ? i : (num - 1);
if (i % 2 == 0) {
for (int j = start; j <= end; j++) {
System.out.print(matrix[i - j][j] + " ");
}
} else {
for (int j = start; j <= end; j++) {
System.out.print(matrix[j][i - j] + " ");
}
}
}
}
}
Python实现
n = int(input("方形矩阵大小:"))
matrix = []
for i in range(n):
matrix.append(input(f"矩阵第{i + 1}行:").split(" "))
start = 0
end = 0
for i in range(2 * n - 1):
if i < n:
start = 0
end = i
else:
start = i - n + 1
end = n - 1
if i % 2 == 0:
for j in range(start, end + 1):
print(matrix[i - j][j], end=" ")
else:
for j in range(start, end + 1):
print(matrix[j][i - j], end=" ")