ZJU1067-Color Me Less(解题来自《ACM国际大学生程序设计竞赛题解(1)》
【题目大意】
问题:
颜色压缩是从一组不连续的颜色映射到更小的一组不连续的颜色。要解决这一问题,需要用标准的24位RGB颜色空间作为映射。输入:由16个RGB颜色构成的目标颜色组;一组任意的RGB颜色,这些颜色需要映射到目标颜色组中最接近的颜色。为了实现目标,我们定义一个RGB颜色为一个有序的三元组(R,G,B),塔门都是从0~255的整数。两个颜色之间距离定义在两个三维空间点之间的欧几里得几何距离。也就是说,给定的两种彩色(R1,G1,B1)和(R2,G2,B2),他们的距离D根据下面的方程计算:
输入文件是一组RGB颜色的列表,每行一个颜色,是三个从0~255的整数,由空格隔开。前面的16个颜色构成目标颜色组,把其余的颜色映射到目标颜色组。当一行是三个-1时,表示输入结束。
【输出】:
对于要映射的每个颜色,输出颜色本身和映射到目标颜色组中最接近的颜色。
【算法分析】
根据给定的目标颜色组,对每一个需要映射的颜色,计算其与目标颜色组中每个颜色的欧几里得几何距离D,D值最小的那个颜色,就是结果。
【程序代码】
#include <iostream> #include <cstdio> using namespace std; struct color { int R,G,B; }map[16]; int main() { int i; for(i=0;i<16;i++) scanf("%d%d%d",&map[i].R,&map[i].G,&map[i].B); color c; while(scanf("%d%d%d",&c.R,&c.G,&c.B)&&(c.R>=0)) { int index=0; int min=65535; for(i=0;i<16;i++) { int d=(map[i].R-c.R)*(map[i].R-c.R)+ (map[i].G-c.G)*(map[i].G-c.G)+ (map[i].B-c.B)*(map[i].B-c.B); if(min>d) { min=d; index=i; } } printf("(%d,%d,%d) maps to (%d,%d,%d)\n",c.R,c.G,c.B,map[index].R, map[index].G,map[index].B); } return 0; }