要点有2
1该点需要做到独一无二,即唯一点
2需要与相邻点的插值都超过TOL
特殊情况:边界,边界的点其相邻点总会有不存在的点,考虑到像素值都是正值,使用一个M+2,N+2的数组存储图像,这样没有存储的外圈的值应该都是-1,通过检查数组对应的值是否是-1就可以检查该像素点是否需要检查
#include <bits/stdc++.h>
using namespace std;
//要点1该点需要做到独一无二,即唯一点
//要点2 需要与相邻点的插值都超过TOL
unordered_map <int,int> appearancetime;//标记该颜色出现次数,键值是颜色,值是出现次数
int main(){
int M,N,TOL;
cin>>M>>N>>TOL;
int image[N+2][M+2];
//cout<<M<<N<<TOL<<endl;
memset(image, -1, sizeof(image));
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
cin>>image[i][j];
appearancetime[image[i][j]]++;
}
}
// for(auto it=appearancetime.begin();it!=appearancetime.end();it++)
// {
// cout<<it->first<<" "<<it->second<<endl;
// }
int xpos[1000];
int ypos[1000];
int cnt=0;
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
if(appearancetime[image[i][j]]==1)
{
//如果不存在,那么直接不检查这个点
//如果存在,那么要检查
if((image[i-1][j-1]!=-1)&&abs(image[i][j]-image[i-1][j-1])<=TOL) continue; //左上
if((image[i-1][j]!=-1)&&abs(image[i][j]-image[i-1][j])<=TOL) continue; //正左
if((image[i][j-1]!=-1)&&abs(image[i][j]-image[i][j-1])<=TOL) continue;//正上
if((image[i-1][j+1]!=-1)&&abs(image[i][j]-image[i-1][j+1])<=TOL) continue;//左下
if((image[i][j+1]!=-1)&&abs(image[i][j]-image[i][j+1])<=TOL) continue;//正下
if((image[i+1][j-1]!=-1)&&abs(image[i][j]-image[i+1][j-1])<=TOL) continue; //右上
if((image[i+1][j]!=-1)&&abs(image[i][j]-image[i+1][j])<=TOL) continue; // 正右
if((image[i+1][j+1]!=-1)&&abs(image[i][j]-image[i+1][j+1])<=TOL) continue;// 右下
else
{
xpos[cnt]=i;
ypos[cnt]=j;
cnt++;
}
}
}
}
if(cnt==0) printf("Not Exist");
else if(cnt==1)
printf("(%d, %d): %d",ypos[0],xpos[0],image[xpos[0]][ypos[0]]);
else
printf("Not Unique");
}