[R12A] 箭头

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

数据规模:2n5002 \le n \le 500

思路

整个图形分成两部分:上半部分是底边长 2n12n-1、高 nn 的等腰三角形,第 ii 行(ii 从 1 开始)有 nin-i 个前导空格和 2i12i-1#;下半部分是 nn 行「n1n-1 个空格加一个 #」。

逐行构造字符串输出即可,总宽度为 2n12n-1

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

仓颉实现

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

main(): Int64 {
    let reader = getStdIn()
    let n = Int64.parse(reader.readln().getOrThrow())
    for (i in 0..n) {
        let sb = StringBuilder()
        for (j in 0..(n - 1 - i)) {
            sb.append(" ")
        }
        for (j in 0..(2 * i + 1)) {
            sb.append("#")
        }
        println(sb.toString())
    }
    for (i in 0..n) {
        let sb = StringBuilder()
        for (j in 0..(n - 1)) {
            sb.append(" ")
        }
        sb.append("#")
        println(sb.toString())
    }
    return 0
}

要点:

  • ii 行(0i<n0 \le i < n)的三角形部分为 n1in-1-i 个空格加 2i+12i+1#,逐行用 StringBuilder 拼接后输出。
  • 区间 0..k 不含右端点,行首空格数为 0 时循环体不执行,恰好对应最后一行无前导空格的情况。