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; }