1068 万绿丛中一点红

 

 

梳理一下题意就是,如果某个像素点只出现过一次,并且与其周围8个相邻像素之差大于某个阀值tol,那么记录这样的像素点,下面是输出的要求:

 

 

 方法:

1。用map统计不同像素点出现的次数;

2。用一个函数判断某像素点是否与其周围8个相邻像素之差大于某个阀值tol。

ps:这题给我感觉和 B1089狼人杀 类似,暴力+特判

#include<iostream>
#include<unordered_map>
#include<algorithm>
using namespace std;

int m,n,tol,a[2000][2000] = {0};
unordered_map<int,int> Only; //统计不同像素点出现的次数 

bool func(int i,int j) {//与8个方向的像素点比较
    if(abs(a[i][j]-a[i-1][j-1]) > tol && abs(a[i][j]-a[i-1][j]) > tol && abs(a[i][j]-a[i-1][j+1]) > tol&& abs(a[i][j]-a[i][j-1]) > tol&& abs(a[i][j]-a[i][j+1]) > tol&& abs(a[i][j]-a[i+1][j-1]) > tol&& abs(a[i][j]-a[i+1][j]) > tol&& abs(a[i][j]-a[i+1][j+1]) > tol)
        return true;
    else
        return false;
}
int main() {
    cin>>n>>m>>tol;
    for(int i = 1; i <= m; ++i) {
        for(int j = 1; j <= n; ++j) {
            scanf("%d",&a[i][j]);
            Only[a[i][j]]++;//统计不同像素点出现的次数 
        }
    }
    int cnt = 0,x,y,color;//统计符合要求的像素点个数,记录当前像素点的坐标
    for(int i = 1; i <= m; ++i) {
        for(int j = 1; j <= n; ++j) {
            if(Only[a[i][j]] == 1 && func(i,j) == true) {//像素点只出现过一次,并且与8个相邻像素的差大于阀值
                cnt++;
                x = i;
                y = j;
                color = a[i][j];
            }
        }
    }
    if(cnt == 1) printf("(%d, %d): %d",y,x,color);
    else if(cnt > 1) printf("Not Unique");
    else printf("Not Exist");
    return 0;
}

 

posted @ 2020-02-24 15:40  tangq123  阅读(193)  评论(0编辑  收藏  举报