1 条题解

  • 0
    @ 2026-6-19 10:30:28

    📝 题目大意

    给定一个 H×WH \times W 的整数矩阵 AA0Ai,j260 \le A_{i,j} \le 26),将 00 替换为英文句点 .,将 1261\sim 26 分别替换为大写字母 A~Z,输出对应的 HH 个长度为 WW 的字符串。

    💡 解题思路

    1. 题目分析H,W100H,W \le 100,可以直接边读边输出,无需存储整个矩阵。核心是将数字 001261\sim 26 分别映射为 .A~Z
    2. 算法推导
      • 读入 HHWW(代码中对应变量 nm)。
      • 遍历每个位置 (i,j)(i, j),读入值 a[i][j]
        • a[i][j] == 0,直接输出 '.'
        • 否则输出 (char)(a[i][j] + 'A' - 1),即利用 ASCII 码偏移将数字 11 \to 'A'22 \to 'B',……,2626 \to 'Z'
      • 每行结束后输出一个换行符。
    3. 边界与细节
      • Ai,j=0A_{i,j} = 0 时不需要作字符转换,直接输出 . 即可。
      • 使用 a[i][j] + 'A' - 1 时,减去的 1 是因为 'A' 本身对应 11,偏移量为 00
      • 数组大小开 105×105105 \times 105 略大于 100100 的下标上限,防止越界。

    ⏱️ 复杂度分析

    • 时间复杂度O(H×W)O(H \times W),每个元素仅被处理一次。
    • 空间复杂度O(H×W)O(H \times W)(存储输入矩阵),也可优化为 O(1)O(1) 额外空间(边读边输出)。

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main () {
    	int n, m, a[105][105];     // n=H, m=W, 数组多开一些防止越界
    	scanf("%d%d", &n, &m);
    	for (int i = 1; i <= n; i++) {
    		for (int j = 1; j <= m; j++) {
    			scanf("%d", &a[i][j]);
    			if (a[i][j] == 0) printf(".");           // 0 → '.'
    			else printf("%c", a[i][j] + 'A' - 1);    // 1~26 → 'A'~'Z'
    		}
    		printf("\n");  // 每行末尾换行
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    691
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者