HihoCoder - 1700 相似颜色 (模拟)

题目链接:点击打开链接

题意:

在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。

题解:题意确实不好懂,就是求3次一个两位十六进制的数字,距离个位和十位相同的十六进制数距离近。暴力膜一下就过了。

#include<bits/stdc++.h>
using namespace std;

int main(){
	map<char,int> m;
	m['0'] = 0;
	m['1'] = 1;
	m['2'] = 2;
	m['3'] = 3;
	m['4'] = 4;
	m['5'] = 5;
	m['6'] = 6;
	m['7'] = 7;
	m['8'] = 8;
	m['9'] = 9;
	m['a'] = 10;
	m['b'] = 11;
	m['c'] = 12;
	m['d'] = 13;
	m['e'] = 14;
	m['f'] = 15;
	map<int,char> mm;
	mm[0] = '0';
	mm[17] = '1';
	mm[34] = '2';
	mm[51] = '3';
	mm[68] = '4';
	mm[85] = '5';
	mm[102] = '6';
	mm[119] = '7';
	mm[136] = '8';
	mm[153] = '9';
	mm[170] = 'a';
	mm[187] = 'b';
	mm[204] = 'c';
	mm[221] = 'd';
	mm[238] = 'e';
	mm[255] = 'f';
	char a[10];
	while(~scanf("%s",a)){
		int x1 = m[a[1]]*16+m[a[2]];
		int x2 = m[a[3]]*16+m[a[4]];
		int x3 = m[a[5]]*16+m[a[6]];
		//cout << x1 <<" "<< x2<<" " << x3<<endl;
		int min1 = 1e9;
		int flag1,flag2,flag3;
		int min2 = 1e9;
		int min3 = 1e9;
		for(int i = 0 ; i <= 255 ; i += 17 ){
//			cout << i << endl;
//			cout << "min1"<<(i-x1) * (i-x1) << endl;
//			cout <<"min" <<min1 << endl;
			if((i-x1) * (i-x1) < min1){
				min1 = (i-x1) * (i-x1);
				flag1 = i;
			}
			if((i-x2) * (i-x2) < min2){
				min2 = (i-x2) * (i-x2);
					flag2 = i;
			}
			if((i-x3) * (i-x3) < min3){
				min3 = (i-x3) * (i-x3);
				flag3 = i;
			}
		
		}
	//	cout << flag1 << " " << flag2 << " " << flag3 << endl;
		cout << "#"<<mm[flag1] <<mm[flag2]<<mm[flag3]<<endl;
	}
		
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值