在CSS中我们可以用井号(#)加6位十六进制数表示一种颜色,例如#000000是黑色,#ff0000是红色,#ffd700是金色。
同时也可以将六位颜色#RRGGBB简写为#RGB三位颜色。例如#000与#000000是相同的,#f00与#ff0000是相同的,#639与#663399是相同的。
对于两个颜色#abcdef和#ghijkl,我们定义其距离是(ab - gh)2 + (cd - ij)2 + (ef - kl)2。(其中ab, cd, ef, gh, ij, kl都是十六进制数,也即0~255的整数)
给定一个六位颜色#abcdef,请你求出距离它最近的三位颜色#rgb。
Input#abcdef
其中abcdef是'0'-'9'或'a'-'f'。
Output距离输入颜色最近的#rgb
#40e0d0Sample Output
#4dc
思路:
要想使(ab - gh)2 + (cd - ij)2 + (ef - kl)2的值最小,只需要使各个括号里的值最小即可。
代码参考:
#include <iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstring>
#define max(a,b) a>b?a:b
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
char str1[10];
int main()
{
char str2[20]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
while(~scanf("%s",str1))
{
getchar();
printf("#");
for(int i=1;i<=6;i+=2)
{
int a=0,b=0,minn=99999,p=0;
for(int j=0;j<16;j++)
{
if(str2[j]==str1[i])
a+=j*16;
if(str2[j]==str1[i+1])
a+=j;
}
for(int k=0;k<16;k++)
{
b=k*16+k;
if(minn>abs(a-b))
{
minn=abs(a-b);
p=k;
}
}
printf("%c",str2[p]);
}
printf("\n");
}
return 0;
}