对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。
输入格式:
输入第一行给出三个正整数,分别是 M 和 N(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,224) 内。所有同行数字间用空格或 TAB 分开。
输出格式:
在一行中按照 (x, y): color
的格式输出所求像素点的位置以及颜色值,其中位置 x
和 y
分别是该像素在图像矩阵中的列、行编号(从 1 开始编号)。如果这样的点不唯一,则输出 Not Unique
;如果这样的点不存在,则输出 Not Exist
。
坑点注意!!:
- 其周围 8 个相邻像素这个描述不准确,矩阵的边角处是没有8个相邻像素的,有几个比较几个就可以了;
- ==“有独一无二颜色的那个像素点”==这个描述属实逆天,这个意思其实是像素不仅需要满足与周围相邻像素颜色的差值要高于tol,同时这个像素值在 整个矩阵之中只能出现一次
本来是使用C语言写的,发现这第二个坑点属实离谱,用C语言实现起来也有点难度,还是直接用C++的map更方便
//#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include<map>
//#include <string.h>
using namespace std;
struct Point{
int row;
int col;
int val;
};
int goal;
int res[1000][1000];
map<int,int> m1;
#define Point struct Point
void init(Point *p1,int row,int col,int val){
p1->row=row;
p1->col=col;
p1->val=val;
}
int judge(int m,int n,int i,int j,int val){
if(i<0||j<0) return 1;
if(i>=m||j>=n) return 1;
if(fabs(res[i][j]-val)>goal){
// printf("%d ",res[i][j]);
return 1;
}
return -1;
}
int main() {
int n,m,i,j,k;
scanf("%d %d %d",&n,&m,&goal);
Point p1[10000];
for(i=0;i<10000;i++)
init(p1+i,-1,-1,-1);
int temp,index=0;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&temp);
res[i][j]=temp;
}
}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
int sign=1;
int temp;
m1[res[i][j]]++;
// 上
for(k=j-1;k<=j+1;k++){
temp=judge(m,n,i-1,k,res[i][j]);
if(temp<0)sign=-1;
}
// 中
for(k=j-1;k<=j+1;k++){
if(k==j) continue;
temp=judge(m,n,i,k,res[i][j]);
if(temp<0)sign=-1;
}
// 下
for(k=j-1;k<=j+1;k++){
temp=judge(m,n,i+1,k,res[i][j]);
if(temp<0)sign=-1;
}
if(sign>0){
p1[index].row=i;
p1[index].col=j;
p1[index].val=res[i][j];
// printf("%d ",res[i][j]);
index++;
}
}
}
int num=0;
Point only;
// 这里原先只判断了满足条件的点是否重复,其实是无论是否满足条件都不能重复
for(i=0;i<index;i++){
if(m1[p1[i].val]==1){
num++;
if(num==1){
only.col=p1[i].col;
only.row=p1[i].row;
only.val=p1[i].val;
}
}
}
if(num==0){
printf("Not Exist\n");
}
else if(num==1){
printf("(%d, %d): %d\n",only.col+1,only.row+1,only.val);
}
else{
printf("Not Unique\n");
}
return 0;
}