[R56C] 斜向矩阵

  • 难度 入门
  • 时限 1s
  • 空限 512m
  • 模拟

数据规模:1n1001 \le n \le 100

思路

数字按「右上 → 左下」方向的斜线依次填入,整个矩阵共有 2n12n-1 条斜线,按从左到右的顺序编号 02n20 \sim 2n-2。若用 i+ji + j 作为 (i, j) 所在斜线的编号,则第 kk 条斜线的起点为:

  • k<nk < n:起点 (0,k)(0, k),斜线在矩阵上半部分;
  • knk \ge n:起点 (kn+1,n1)(k - n + 1, n - 1),斜线在矩阵下半部分。

从起点出发沿 i+1, j1i+1,\ j-1 方向走到边界,依次填入 1n21 \sim n^2 即可。

复杂度:时间 O(n2)O(n^2),空间 O(n2)O(n^2)

仓颉实现

import std.env.*
import std.convert.*

main(): Int64 {
    let reader = getStdIn()
    let n = Int64.parse(reader.readln().getOrThrow())
    let nn = n
    let a = Array<Array<Int64>>(nn, { _ => Array<Int64>(nn, { _ => 0 }) })
    var cnt: Int64 = 1
    for (k in 0..(2 * nn - 1)) {
        var i: Int64 = 0
        var j: Int64 = k
        if (k >= nn) {
            i = k - nn + 1
            j = nn - 1
        }
        while (i < nn && j >= 0) {
            a[i][j] = cnt
            cnt += 1
            i += 1
            j -= 1
        }
    }
    var sb = StringBuilder()
    for (i in 0..nn) {
        for (j in 0..nn) {
            sb.append(a[i][j])
            if (j != nn - 1) {
                sb.append(" ")
            }
        }
        println(sb.toString())
        sb = StringBuilder()
    }
    return 0
}