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=" ")
上一篇下一篇

猜你喜欢

热点阅读