Posted on 2010-08-18 01:00
Brian 阅读(414)
评论(0) 编辑 收藏 引用 所属分类:
POJ
唉,半年没有切题的后果就是这道水题写了整整3个小时。。。
题目的要求是输入若干组颜色数据,前16组是目标组,后面剩下的都是用来尝试与其映射的,用后面与前面的一次匹配,各循环16次,各自最小的D的相应映射组就是我们要的结果。
C++ 编译器 ,220K 0MS
#include<iostream>
#include<climits> // 为第一组数据运算做的约束
using namespace std;
int RGB[16][3],in[3],out[3]; // in 用来接收数据, out 用来暂存映射正确的数据
int main(){
for (int i=0; i<16; i++) // 输入的数据中前16组是 target set
cin>>RGB[i][0]>>RGB[i][1]>>RGB[i][2];
while (1) {
cin>>in[0]>>in[1]>>in[2]; // 开始接收映射组
if (in[0] == -1) break;
int MIN=INT_MAX; // 2147483647
for (int i=0; i<16; i++) {
int sum=(RGB[i][0]-in[0])*(RGB[i][0]-in[0])+
(RGB[i][1]-in[1])*(RGB[i][1]-in[1])+
(RGB[i][2]-in[2])*(RGB[i][2]-in[2]); // 不需要开方,开方易产生误差
if (sum < MIN) {
out[0]=RGB[i][0];
out[1]=RGB[i][1];
out[2]=RGB[i][2];
MIN=sum; // 最小的即映射成功
}
}
cout<<"("<<in[0]<<","<<in[1]<<","<<in[2]<<") maps to ("
<<out[0]<<","<<out[1]<<","<<out[2]<<")"<<endl;
}
return 0;
}
有一点要说明的是<limits.h>头文件,建议MSDN一下,你会发现很多有用的常量,拿来就能用。