对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。
输入格式:
输入第一行给出三个正整数,分别是 M 和 N(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,224) 内。所有同行数字间用空格或 TAB 分开。
输出格式:
在一行中按照 (x, y): color
的格式输出所求像素点的位置以及颜色值,其中位置 x
和 y
分别是该像素在图像矩阵中的列、行编号(从 1 开始编号)。如果这样的点不唯一,则输出 Not Unique
;如果这样的点不存在,则输出 Not Exist
。
输入样例 1:
8 6 200
0 0 0 0 0 0 0 0
65280 65280 65280 16711479 65280 65280 65280 65280
16711479 65280 65280 65280 16711680 65280 65280 65280
65280 65280 65280 65280 65280 65280 165280 165280
65280 65280 16777015 65280 65280 165280 65480 165280
16777215 16777215 16777215 16777215 16777215 16777215 16777215 16777215
输出样例 1:
(5, 3): 16711680
输入样例 2:
4 5 2
0 0 0 0
0 0 3 0
0 0 0 0
0 5 0 0
0 0 0 0
输出样例 2:
Not Unique
输入样例 3:
3 3 5
1 2 3
3 4 5
5 6 7
输出样例 3:
Not Exist
用二维数组存储输入N行M列的像素值。
对像素是否是唯一的可以利用map 将元素值和其出现的次数对应映射,在输入的像素的时候,如果出现重复像素值,则对应像素的键值++。
再利用for循环依次遍历每一个像素值,如果该像素是唯一的并且与周围的8个元素相差绝对值大于TOL,则将计数器加一,并且用两个整数记录对应的坐标x,y。
如果计数器为0则不存在,如果计数器为1输出x、y、像素值。否则输出不唯一。
以下为源代码:
#include<bits/stdc++.h>
using namespace std;
const int dr[] = {1,-1,0,0,1,1,-1,-1};//下 上 右 左 右上 右下 左上 左下
const int dc[] = {0,0,1,-1,1,-1,1,-1};
int a[1001][1001];
map<int,int> rs;
int M,N,TOL;
bool judge(int r,int c) {
for(int i = 0; i < 8; ++i) {
int nx = r+dr[i], ny = c+dc[i];
if(nx < 0 || nx >= M || ny < 0 || ny >= N) continue;
if(abs(a[nx][ny]-a[r][c])<=TOL) return false;
}
return true;
}
int main(){
//freopen("test.txt","r",stdin);
cin>>N>>M>>TOL;
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
cin>>a[i][j];
rs[a[i][j]]++;
}
}//初始化图像
int x,y=0;
int cnt=0;
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
int data=a[i][j];
if(rs[data]==1&&judge(i,j)){//边界判断!
x=i;
y=j;
cnt++;
}
}
}
if(cnt==0) cout<<"Not Exist"<<endl;
else if(cnt==1)
cout<<"("<<y+1<<", "<<x+1<<")"<<": "<<a[x][y]<<endl;
else{
cout<<"Not Unique"<<endl;
}
}
关键点
利用map去过滤不唯一的像素值。
因为只需要输出一个坐标点,所以只需要用两个整形变量去存储坐标值,而不需要去纠结其他点的坐标如何存储。
judge函数 构建遍历数组增值。依次从下 上 右 左 右上 右下 左上 左下方向去取元素与中心元素进行对比。
利用计数器判断满足结果的点的个数。
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)