1 条题解
-
0
题目分析
本题是关于颜色缩减的问题,需要将任意 RGB 颜色映射到给定的 16 种目标颜色中最接近的颜色。颜色间的距离定义为三维空间中的欧几里得距离,即对于颜色和,其距离。若存在多个颜色距离相同,则选择目标集中最先出现的颜色。
算法标签
最近邻搜索算法:通过计算欧几里得距离在有限候选集中查找最接近的点。 暴力枚举:由于目标颜色集仅 16 种颜色,可直接遍历所有候选颜色计算距离。 数值计算:涉及平方和平方根运算以计算三维空间中的距离。
解题思路
输入处理: 读取前 16 行作为目标颜色集,后续行作为待映射颜色,直到遇到终止标记-1 -1 -1。 距离计算: 对于每个待映射颜色,计算其与目标集中 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
- 上传者