一开始因为看见这题就头疼,可费了点时间。
要考虑所有元素,如果忽略外圈元素,最后一个样例过不去。
而且要求只出现一次的元素,
我没有使用map,因为当时还没学,用map储存元素会节约好多代码

#include<cstdio>
#include<string.h>
int M,N,TOL;
int arr[1001][1001];
int da[20000000]={0};
int dir[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};
bool judge(int i, int j) {
    for (int k = 0; k < 8; k++) {
        int tx = i + dir[k][0];
        int ty = j + dir[k][1];
        if (tx >= 0 && tx < M && ty >= 0 && ty < N && arr[i][j] - arr[tx][ty] >= 0 - TOL && arr[i][j] - arr[tx][ty] <= TOL) return false;
    }
    return true;
}
bool istrue(int i,int j){
    long long high=arr[i][j]+TOL;
    long long low=arr[i][j]-TOL;
    for(int m=i-1;m<(i+2);m++){
        for(int n=j-1;n<(j+2);n++){
            if(arr[m][n]>=low&&arr[m][n]<=high&&m!=i&&n!=j)
                return false;
        }
    }
    return true;
}
int main(){
    scanf("%d %d %d",&M,&N,&TOL);
    int num=0,data[2];
    for(int i=0;i<N;i++){                                                       //input
        for(int j=0;j<M;j++){
            scanf("%d",&arr[i][j]);
            da[arr[i][j]]++;
        }
    }
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            if(judge(i,j)&&da[arr[i][j]]==1){
                if(num==1){
                    printf("Not Unique");return 0;
                }
                else{
                    data[0]=i;data[1]=j;num++;
                }
            }
        }
    }
    if(num==0){
        printf("Not Exist");
    }else{
        printf("(%d, %d): %d",data[1]+1,data[0]+1,arr[data[0]][data[1]]);
    }
    return 0;
}