原题链接

题目大意:一道类似于简单图像压缩的题目。给定一个调色板,然后把24位真彩色按照就近原则聚类。

解法:每个像素的色彩都是RGB三个值,相当于三维空间的一个点。所以当一个新的像素进来时,分别和调色板中的每一个颜色求欧式距离,距离最近的那个点就是应该归属的那个类。

 

参考代码:

#include<stdio.h>
#include<math.h>

#define R 0
#define G 1
#define B 2

int target[16][3];

int main(){
	int i,j,min,index;
	int RGB[3];
	float dist;
	for(i=0;i<16;i++){
		scanf("%d%d%d",&target[i][R],&target[i][G],&target[i][B]);
	}
	while(scanf("%d%d%d",&RGB[R],&RGB[G],&RGB[B]))
	{
		if(RGB[R]==-1||RGB[G]==-1||RGB[B]==-1)
			break;
		min=3*255*255;
		for(i=0;i<16;i++){
			dist=(RGB[R]-target[i][R])*(RGB[R]-target[i][R])+(RGB[G]-target[i][G])*(RGB[G]-target[i][G])
				+(RGB[B]-target[i][B])*(RGB[B]-target[i][B]);
			if(dist<min){
				min=dist;
				index=i;
			}
		}
		printf("(%d,%d,%d) maps to (%d,%d,%d)\n",RGB[R],RGB[G],RGB[B],target[index][R],target[index][G],target[index][B]);

	}

	return 0;
}