在图像编码的算法中,需要将一个给定的方形矩阵进行 ZZ 字形扫描(Zigzag Scan)。
给定一个 n×nn×n 的矩阵,ZZ 字形扫描的过程如下图所示:
对于下面的 4×44×4 的矩阵,
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
对其进行 ZZ 字形扫描后得到长度为 1616 的序列:1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
。
请实现一个 ZZ 字形扫描的程序,给定一个 n×nn×n 的矩阵,输出对这个矩阵进行 ZZ 字形扫描的结果。
输入格式
输入的第一行包含一个整数 nn,表示矩阵的大小。
输入的第二行到第 n+1n+1 行每行包含 nn 个正整数,由空格分隔,表示给定的矩阵。
输出格式
输出一行,包含 n×nn×n 个整数,由空格分隔,表示输入的矩阵经过 ZZ 字形扫描后的结果。
数据范围
1≤n≤5001≤n≤500,
矩阵元素为不超过 10001000 的正整数。
输入样例:
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
package main
import (
"fmt"
)
var a = make([][]int, 510)
func main(){
var n int
fmt.Scanf("%d", &n)
for i := 1; i <= n ; i ++ {
a[i] = make([]int, 510)
for j:= 1; j <= n; j ++{
fmt.Scanf("%d", &a[i][j])
}
}
// fmt.Println(n, a)
for i := 2; i <= 2* n ; i ++ {
if i % 2 != 0 {
for j := 1 ; j < i ; j ++ {
if j >= 1 && j <= n && i - j <= n && i - j >= 1{
fmt.Printf("%d ", a[j][i - j])
}
}
}else{
for j := i - 1 ; j > 0 ; j -- {
if j >= 1 && j <= n && i - j <= n && i - j >= 1{
fmt.Printf("%d ", a[j][i - j])
}
}
}
}
}