坑点:输入M和N,二维数组是N行M列,还有输出的时候也是N行M列;
当某个像素点不止出现一次时,即map中频次大于1时,注定不是所求。
思路:d[8][2]这个二维数组用于对遍历a[][]数组时,做偏移用,当然偏移完后肯定要判断一下下标是否越界,所有有了judge()函数。
#include<bits/stdc++.h>
using namespace std;
int M,N,TOL;
int a[9999][9999];
int d[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};
bool judge(int i,int j){
if(i<0||i>=N||j<0||j>=M)
return false;
return true;
}
bool f(int i,int j){
for(int k=0;k<8;k++){
int ii=i+d[k][0],jj=j+d[k][1];
if(judge(ii,jj)){
if(abs(a[i][j]-a[ii][jj])<=TOL)
return false;
}
}
return true;
}
int main(){
scanf("%d%d%d",&M,&N,&TOL);
map<int,int>freq;//记录像素点出现的频次
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
scanf("%d",&a[i][j]);
freq[a[i][j]]++;
}
}
int column,row,num=0;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
if(freq[a[i][j]]==1&&f(i,j)){
column=i;
row=j;
num++;
}
}
if(num>1){
printf("Not Unique");
return 0;
}
}
if(num==0)
printf("Not Exist");
else
printf("(%d, %d): %d",row+1,column+1,a[column][row]);
return 0;
}