</pre>问题描述:<p></p><p>颜色缩减就是把一组离散的颜色映射到一个较小范围的颜色上。解决这个问题需要提供一组标准的24位颜色空间中的一个映射。输入16个RGB颜色值作为目标集合。对于任意RGB颜色映射到这个集合中最接近的一个。为此,我们把一个RGB颜色定义为一个有序的三元组(R,G,B),其中每个值都是从0到255的整数。两种颜色之间的距离被定义为两个三维点之间的欧几里德距离。即给定的两种颜色(R1,G1,B1),(R2,G2,B2),它们的距离D由下式给出:</p><p> </p><p><strong>输入:</strong></p><p> 输入包括多个RGB颜色,每个颜色占一行,包括3个从0到255的整数,空格隔开。前16种颜色为需要映射的目标颜色。三个-1,表示输入结束。</p><p><strong>输出:</strong></p><p> 对于每种颜色,输出目标集最近的映射。如果有多个相同的最小距离,输出集合中最先出现的那个。</p><p><strong>输入样例:</strong></p><p>0 0 0</p><p>255 255 255</p><p>0 0 1</p><p>1 1 1</p><p>128 0 0</p><p>0 128 0</p><p>128 128 0</p><p>0 0 128</p><p>126 168 9</p><p>35 86 34</p><p>133 41 193</p><p>128 0 128</p><p>0 128 128</p><p>128 128 128</p><p>255 0 0</p><p>0 1 0</p><p>0 0 0</p><p>255 255 255</p><p>253 254 255</p><p>77 79 134</p><p>81 218 0</p><p>-1 -1 -1</p><p><strong>输出样例:</strong></p><p>(0,0,0) maps to (0,0,0)</p><p>(255,255,255) maps to (255,255,255)</p><p>(253,254,255) maps to (255,255,255)</p><p>(77,79,134) maps to (128,128,128)</p><p>(81,218,0) maps to (126,168,9)</p><p><strong>解题分析:<span style="color:#ff0000">看着比较复杂的一道题,只要根据给出的数据,挨个枚举计算比较出最小的即可。需要注意的是这里的欧几里得距离要用long,输出格式也需要注意。刚开始在敲代码的时候没有注意打错了r,g,b,而且在检查的时候不易检查出来wa了一次。</span></strong></p><p></p><pre code_snippet_id="366180" snippet_file_name="blog_20140527_2_855370" name="code" class="cpp">#include<stdio.h>
int main()
{
int r[16],g[16],b[16];
int x,y,z;
int pos;
long d,min_d;
int i;
for(i=0;i<16;i++)
scanf("%d %d %d",&r[i],&g[i],&b[i]);
while(scanf("%d %d %d",&x,&y,&z)!=EOF)
{
if(x==-1 && y==-1 && z==-1) break;
pos=0;
min_d=(x-r[0])*(x-r[0])+(y-g[0])*(y-g[0])+(z-b[0])*(z-b[0]);
for(i=1;i<16;i++)
{
d=(x-r[i])*(x-r[i])+(y-g[i])*(y-g[i])+(z-b[i])*(z-b[i]);
if(d<min_d)
{
min_d=d;
pos=i;
}
}
printf("(%d,%d,%d) maps to (%d,%d,%d)\n",x,y,z,r[pos],g[pos],b[pos]);
}
return 0;
}