题目
思路
对于所有颜色出现次数的记录,可以直接用int到int的映射,作为散列记录。关于对颜色的判定,参考了柳神和秦神的代码; 以任意a[i][j]为中心,需要进行8次判定。 建立一个二维数组: int dir[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}}; 对任意的i,j,使i+数组每列前一位=x,j+每列后一位=y,即可得到上表。
判定条件为,当x>=0&&<n(包含了边界条件,x=0,x=n-1) && y>=0&&<m时,若abs(a[i][j]-a[x][y]) <=tol 则说明非所求点。
代码中运用了对立条件来判断,因为某个方向的像素与该像素的差的绝对值小于等于dis即可证明该像素不满足条件,从而减少判断的次数
AC代码
#include<bits/stdc++.h>
using namespace std
;
int a
[1001][1001]={0},tol
;
int m
,n
;
int dir
[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
bool check(int i
,int j
){
int x
,y
;
for(int k
=0;k
<8;k
++){
x
=i
+dir
[k
][0];
y
=j
+dir
[k
][1];
if(x
>=0 && x
<n
&& y
>=0 && y
<m
&& abs(a
[i
][j
]-a
[x
][y
])<=tol
) return false;
}
return true;
}
int main(){
cin
>>m
>>n
>>tol
;
map
<int,int> v
;
for(int i
=0;i
<n
;i
++){
for(int j
=0;j
<m
;j
++){
cin
>>a
[i
][j
];
v
[a
[i
][j
]]++;
}
}
int cnt
=0;
int x
,y
;
for(int i
=0;i
<n
;i
++){
for(int j
=0;j
<m
;j
++){
if(v
[a
[i
][j
]]==1 && check(i
,j
)){
cnt
++;
x
=i
;
y
=j
;
}
}
}
if(cnt
==1) cout
<<'('<<y
+1<<", "<<x
+1<<"): "<<a
[x
][y
]<<endl
;
else if(cnt
>1) cout
<<"Not Unique" ;
else cout
<<"Not Exist";
return 0;
}