Posted on 2010-08-18 01:00
Brian 閱讀(433)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
POJ
唉,半年沒有切題的后果就是這道水題寫了整整3個(gè)小時(shí)。。。
題目的要求是輸入若干組顏色數(shù)據(jù),前16組是目標(biāo)組,后面剩下的都是用來嘗試與其映射的,用后面與前面的一次匹配,各循環(huán)16次,各自最小的D的相應(yīng)映射組就是我們要的結(jié)果。
C++ 編譯器 ,220K 0MS
#include<iostream>
#include<climits> // 為第一組數(shù)據(jù)運(yùn)算做的約束
using namespace std;
int RGB[16][3],in[3],out[3]; // in 用來接收數(shù)據(jù), out 用來暫存映射正確的數(shù)據(jù)
int main(){
for (int i=0; i<16; i++) // 輸入的數(shù)據(jù)中前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]); // 不需要開方,開方易產(chǎn)生誤差
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;
}
有一點(diǎn)要說明的是<limits.h>頭文件,建議MSDN一下,你會(huì)發(fā)現(xiàn)很多有用的常量,拿來就能用。