1 条题解

  • 0
    @ 2025-5-6 3:50:21

    解题思路:

    本题要求对输入的图像进行反走样处理,将每个2×22×2像素块的平均值(向下取整)作为新像素值,生成尺寸为原图像尺寸各减11的新图像。关键在于正确处理输入格式并准确计算每个像素块的平均值。

    关键步骤:

    1. 输入解析

      • 循环读取多个数据集,直到遇到终止标志 ENDOFINPUTENDOFINPUT
      • 每个数据集以 STARTRCSTART R C 开头,后接 RR 行像素数据,最后以 ENDEND 结束。
    2. 像素块处理

      • 对原始图像中的每个2×22×2像素块,计算四个像素的平均值并向下取整。
      • 新图像的尺寸为 (R1)×(C1)(R-1)×(C-1),遍历范围为原始图像的第11行到第R1R-1行,第11列到第C1C-1列。
    3. 结果输出

      • 逐行输出处理后的像素值,每行结束后换行。

    实现细节:

    • 输入存储:使用二维数组 arrarr 存储原始像素值,通过字符逐个读取并转换为整数。
    • 遍历范围:新图像的行范围为 1i<R1 ≤ i < R,列范围为 1j<C1 ≤ j < C,对应原始图像的四个像素 (i1,j1)(i1,j)(i,j1)(i,j)(i-1,j-1)、(i-1,j)、(i,j-1)、(i,j)
    • 平均值计算:对四个像素求和后除以44并向下取整,直接输出结果避免额外存储。

    特殊情况处理:

    • R=2R=2C=2C=2 时,新图像仅剩11行或11列。
    • 所有计算均使用整数运算,确保向下取整正确性。

    C++实现:

    #include <cstdio>
    #include <cstring>
    
    int arr[10][10]; // 存储原始像素的数组,支持最大9x9图像
    
    int main() {
        char tmp[20];
        while (scanf("%s", tmp), strcmp(tmp, "ENDOFINPUT")) { // 循环处理数据集
            int r, c;
            scanf("%d%d", &r, &c); // 读取行数和列数
            getchar(); // 跳过换行符
            
            // 读取原始像素数据
            for (int i = 0; i < r; i++) {
                for (int j = 0; j < c; j++) {
                    arr[i][j] = getchar() - '0'; // 字符转数字
                }
                getchar(); // 跳过行尾换行符
            }
            
            // 计算并输出反走样后的图像
            for (int i = 1; i < r; i++) {      // 新图像行范围
                for (int j = 1; j < c; j++) {  // 新图像列范围
                    int sum = arr[i-1][j-1] + arr[i-1][j] + arr[i][j-1] + arr[i][j];
                    printf("%d", sum / 4);     // 平均值向下取整
                }
                printf("\n");
            }
            
            scanf("%s", tmp); // 读取END标记
            getchar(); // 跳过END后的换行符
        }
        return 0;
    }
    
    • 1

    信息

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