萬綠叢中一點紅(使用map)

**

萬綠叢中一點紅

注:題目非原創

**
對於計算機而言,顏色不過是像素點對應的一個 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
代碼:

#include <cstdio>
#include <cmath>
#include <map>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

int m, n, tol, ansi, ansj, ans;
int arr[1005][1005];
map<int, int> bi;
bool key = false;
int judge(int a, int b){
    if(abs(a-b) > tol) return 0;
    return 1;
}

int search(int i, int j){
    for (int p = -1; p<=1; p++)
        for (int q = -1; q<=1; q++){
            if((q||p) && i+p >= 1 && i+p <= n && j+q >= 1 && j+q <= m && judge(arr[i+p][j+q], arr[i][j])){
                return 0;
            }
        }
        return 1;
}



int main()
{
    cin >> m >> n >> tol;
    for (int i = 1; i <= n; i++) 
        for(int j = 1; j <= m; j++) {
            cin >> arr[i][j];
            bi[arr[i][j]]++;            
        }

    for (int i = 1; i <= n; i++) 
        for(int j = 1; j <= m; j++){
            if(bi[arr[i][j]] == 1 && search(i, j)){
                if(key){
                    cout << "Not Unique" << endl;
                    return 0;

                }
                ansi = i; ansj = j; ans = arr[i][j]; key = true;
            }
        }
    if (key) printf("(%d, %d): %d\n", ansj, ansi, ans);
    else cout << "Not Exist" << endl;

    return 0;
}
發佈了29 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章