Posted on 2010-08-18 01:00
Brian 閱讀(433)
評論(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一下,你會發現很多有用的常量,拿來就能用。