1. 程式人生 > >【PAT乙級】1068 萬綠叢中一點紅

【PAT乙級】1068 萬綠叢中一點紅

對於計算機而言,顏色不過是畫素點對應的一個 24 位的數值。現給定一幅解析度為 M×N 的畫,要求你找出萬綠叢中的一點紅,即有獨一無二顏色的那個畫素點,並且該點的顏色與其周圍 8 個相鄰畫素的顏色差充分大。

輸入格式:

輸入第一行給出三個正整數,分別是 M 和 N(≤ 1000),即影象的解析度;以及 TOL,是所求畫素點與相鄰點的顏色差閾值,色差超過 TOL 的點才被考慮。隨後 N 行,每行給出 M 個畫素的顏色值,範圍在 [0,2​24​​) 內。所有同行數字間用空格或 TAB 分開。

輸出格式:

在一行中按照 (x, y): color 的格式輸出所求畫素點的位置以及顏色值,其中位置 x

 和 y 分別是該畫素在影象矩陣中的列、行編號(從 1 開始編號)。如果這樣的點不唯一,則輸出 Not Unique;如果這樣的點不存在,則輸出 Not Exist

輸入樣例 1:

8 6 200

0      0       0        0        0          0           0        0

65280      65280    65280    16711479 65280    65280    65280    65280

16711479 65280    65280    65280    16711680 65280    65280    65280

65280      65280    65280    65280    65280    65280    165280   165280

65280      65280       16777015 65280    65280    165280   65480    165280

16777215 16777215 16777215 16777215 16777215 16777215 16777215 16777215

輸出樣例 1:

(5, 3): 16711680

輸入樣例 2:

4 5 2

0 0 0 0

0 0 3 0

0 0 0 0

0 5 0 0

0 0 0 0

輸出樣例 2:

Not Unique

輸入樣例 3:

3 3 5

1 2 3

3 4 5

5 6 7

輸出樣例 3:

Not Exist

個人理解

這題我真是服了,太有PAT的風格了,最重要的資訊隱藏在題目中最不引人注意的地方,注意題目中【要求你找出萬綠叢中的一點紅,即有獨一無二顏色的那個畫素點】,所以要找的點一定是獨一無二的哦,我被這個點卡了好一會兒。

這題其實很簡單,就是對矩陣中的每個點進行判斷即可,主要有兩個坑。

1、即上面說的要找的是獨一無二的值。

2、邊緣也要考慮在內,即最左、最右兩列,最上、最下兩行。

程式碼實現

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#define ll long long
#define ep 1e-5
#define INF 0x7FFFFFFF

using namespace std;

const int maxn = 1005;
int img[maxn][maxn];
int m, n, tol;

const int foot[3] = {0, -1, 1};

//判斷是否是獨一無二的點
bool unique_color(int color, int ii, int jj) {
    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < m; j ++) {
            if (color == img[i][j] && !(i == ii && j == jj))
                return false;
        }
    }
    return true;
}

//判斷是否滿足色差
bool check(int i, int j) {
    for (int ii = 0; ii < 3; ii ++) {
        int pos_i = i + foot[ii];
        if (pos_i < 0 || pos_i >= n) continue;
        for (int jj = 0; jj < 3; jj ++) {
            int pos_j = j + foot[jj];
            if (pos_j < 0 || pos_j >= m) continue;
            if (pos_i == i && pos_j == j) continue;
            if (abs(img[pos_i][pos_j] - img[i][j]) <= tol) return false;
        }
    }
    return true;
}

int main() {
    //輸入
    cin >> m >> n >> tol;
    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < m; j ++) {
            cin >> img[i][j];
        }
    }
    
    //統計個數
    int cnt = 0, x = 0, y = 0, color = 0;
    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < m; j ++) {
            if (check(i, j) && unique_color(img[i][j], i, j)) {
                cnt ++;
                x = j + 1;
                y = i + 1;
                color = img[i][j];
            }
        }
    }
    
    //輸出
    if (cnt == 0) {
        cout << "Not Exist" << endl;
    }
    else if (cnt == 1) {
        printf("(%d, %d): %d\n", x, y, color);
    }
    else{
        cout << "Not Unique" << endl;
    }
    return 0;
}