Life is short, so we need program

每日一题, 积累从点滴开始

  :: 首页 :: 博问 :: 闪存 :: :: 联系 :: :: 管理 ::

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

 

posted on 2013-05-07 23:56  CDU_ICPC  阅读(395)  评论(0编辑  收藏  举报