1. 程式人生 > 實用技巧 >PTA 乙級 1068 萬綠叢中一點紅 (20分) C++

PTA 乙級 1068 萬綠叢中一點紅 (20分) C++

本題的輸入不要用cin,要用scanf,否則會有測試點4的超時

思路:利用map來儲存每個畫素點出現的次數,judge函式判斷與周圍八個畫素點的色差閾值是否超過TOL,輸入時讓每個畫素點的出現次數做累加,方便之後判斷本畫素點是否是隻出現過一次的(輸入樣式1中,16711479超過了色差閾值,但是有兩個16711479,不符合),對每個畫素點進行遍歷,如果只出現過一次且與周圍八個點的色差超過TOL,則flag++(獨一無二的畫素點),若只有一個這樣的畫素點(falg == 1),則輸出他的(x,y)(編號從1開始算起),若沒有這樣的畫素點(flag == 0),則輸出 Not Exist,若有超過1個這樣的畫素點(flag >= 2),則輸出Not Unique

 1 #include<iostream>
 2 #include<map>
 3 
 4 using namespace std;
 5 
 6 /*所有畫素點*/
 7 int px[1002][1002] = { 0 };                            
 8 
 9 int judge(int i, int j, int tol) {                    //八個位置的判斷
10     if ((abs(px[i][j] - px[i][j + 1]) > tol) &&
11         (abs(px[i][j] - px[i][j - 1
]) > tol) && 12 (abs(px[i][j] - px[i + 1][j]) > tol) && 13 (abs(px[i][j] - px[i - 1][j]) > tol) && 14 (abs(px[i][j] - px[i - 1][j - 1]) > tol) && 15 (abs(px[i][j] - px[i - 1][j + 1]) > tol) && 16 (abs(px[i][j] - px[i + 1
][j - 1]) > tol) && 17 (abs(px[i][j] - px[i + 1][j + 1]) > tol)) 18 return 1; 19 return 0; 20 } 21 22 int main() { 23 int n = 0, m = 0, tol = 0; 24 /*輸出標誌位*/ 25 int flag = 0; 26 map<int, int> unique; //map<key,值>來儲存每個畫素點的出現次數 27 /*行,列*/ 28 int h = 0, l = 0; 29 scanf("%d %d %d", &m, &n, &tol); 30 for (int i = 1; i <= n; ++i) 31 for (int j = 1; j <= m; ++j) { 32 scanf("%d", &px[i][j]); 33 unique[px[i][j]]++; //畫素點出現次數累加 34 } 35 for (int i = 1; i <= n; ++i) { 36 for (int j = 1; j <= m; ++j) { 37 if (unique[px[i][j]] == 1 && judge(i, j, tol)) { //畫素點只出現過一次,且超過色差範圍 38 flag++; 39 h = i; 40 l = j; 41 } 42 } 43 } 44 if (flag == 1) printf("(%d, %d): %d", l, h, px[h][l]); 45 else if (flag == 0) cout << "Not Exist"; 46 else cout << "Not Unique"; 47 return 0; 48 }