1 条题解

  • 0
    @ 2025-5-11 17:26:03

    题目分析

    本题是关于颜色缩减的问题,需要将任意 RGB 颜色映射到给定的 16 种目标颜色中最接近的颜色。颜色间的距离定义为三维空间中的欧几里得距离,即对于颜色(R1,G1,B1)(R1, G1, B1)(R2,G2,B2)(R2, G2, B2),其距离D=(R2R1)2+(G2G1)2+(B2B1)2D = \sqrt{(R2-R1)^2 + (G2-G1)^2 + (B2-B1)^2}。若存在多个颜色距离相同,则选择目标集中最先出现的颜色。

    算法标签

    最近邻搜索算法:通过计算欧几里得距离在有限候选集中查找最接近的点。 暴力枚举:由于目标颜色集仅 16 种颜色,可直接遍历所有候选颜色计算距离。 数值计算:涉及平方和平方根运算以计算三维空间中的距离。

    解题思路

    输入处理: 读取前 16 行作为目标颜色集,后续行作为待映射颜色,直到遇到终止标记-1 -1 -1。 距离计算: 对于每个待映射颜色(R,G,B)(R, G, B),计算其与目标集中 16 种颜色的欧几里得距离。 最近邻查找: 维护当前最小距离及对应的颜色索引,遍历目标集时更新最小值。若遇到相同距离,保留索引较小的颜色(即最先出现的颜色)。 输出结果: 按顺序输出每个待映射颜色及其最近的目标颜色。

    参考代码

    #include <cstdio>
    #include <cstdlib>
     
    int target[20][3];
     
    int main(void){
        int i,j;
        int minlen, min;
        int len;
        int x, y, z;
     
        for (i = 0; i < 16; i++){
            scanf("%d%d%d", &target[i][0], &target[i][1], &target[i][2]);
        }
        while (scanf("%d%d%d", &x, &y, &z), x != -1 && y != -1 && z != -1){
            min = -1;
            minlen = 1000000;
            for (i = 0; i < 16; i++){
                len = (target[i][0] - x) * (target[i][0] - x) + (target[i][1] - y) * (target[i][1] - y) + (target[i][2] - z) * (target[i][2] - z);
                if (len < minlen){
                    min = i;
                    minlen = len;
                }
            }
            printf("(%d,%d,%d) maps to (%d,%d,%d)\n", x, y, z, target[min][0], target[min][1], target[min][2]);
        }
        return 0;
    }
    
    
    • 1

    信息

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