颜色映射poj1046(今天刚刚开通csdn,小试一下)

</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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值