对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。
输入第一行给出三个正整数,分别是 M 和 N(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,224) 内。所有同行数字间用空格或 TAB 分开。
在一行中按照 (x, y): color 的格式输出所求像素点的位置以及颜色值,其中位置 x 和 y 分别是该像素在图像矩阵中的列、行编号(从 1 开始编号)。如果这样的点不唯一,则输出 Not Unique;如果这样的点不存在,则输出 Not Exist。
思路:这题跟阅读理解题一样,首先得注意这个词:独一无二,就是说这个数只出现过一次,因为输入可能存在着这样一个数,色差超过TOL但是这个数出现过多次,此时这个数是不符合要求的。另外还需要对边界进行判断,保证不越界。
#include <iostream> #include <vector> #include <map> #include <cmath> using namespace std; bool judge(int x,int y,int m,int n){ if(x<0||y<0||x>=n||y>=m) return false; return true; } int main() { int m,n,tol,cnt=0,i,j,k; vector<int> vx,vy; //把合格的点的行号和列号存入vx和vy中。 map<int,int> mp; //统计每个点出现的次数 cin >>m>>n>>tol; int a[n][m],x[8]={0,0,-1,1,1,1,-1,-1},y[8]={-1,1,0,0,1,-1,1,-1}; for(i=0;i<n;i++) for(j=0;j<m;j++){ scanf("%d",&a[i][j]); mp[a[i][j]]++; //统计 } for(i=0;i<n;i++) for(j=0;j<m;j++){ for(k=0;k<8;k++){ if(!judge(i+x[k],j+y[k],m,n)) continue; int tmp=abs(a[i][j]-a[i+x[k]][j+y[k]]); if(tmp<=tol) break; } if(k==8&&mp[a[i][j]]==1){ //这个点是独一无二的 cnt++; vx.push_back(i); vy.push_back(j); } } if(cnt==0) cout <<"Not Exist"; else if(cnt>1) cout <<"Not Unique"; else if(cnt==1) printf("(%d, %d): %d",vy[0]+1,vx[0]+1,a[vx[0]][vy[0]]); return 0; }