题目:
对于计算机而言,颜色不过是像素点对应的一个 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个数之差大于某个值
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
using namespace std;
bool eight(vector<vector<int>>v,int i,int j,int k,int n,int m){
if(i-1>=0){
if(j-1>=0) if(abs(v[i-1][j-1]-v[i][j])<=k) return false;
if(abs(v[i-1][j]-v[i][j])<=k) return false;
if(j+1<m) if(abs(v[i-1][j+1]-v[i][j])<=k) return false;
}
if(j-1>=0) if(abs(v[i][j-1]-v[i][j])<=k) return false;
if(j+1<m) if(abs(v[i][j+1]-v[i][j])<=k) return false;
if(i+1<n) {
if(j-1>=0) if(abs(v[i+1][j-1]-v[i][j])<=k) return false;
if(abs(v[i+1][j]-v[i][j])<=k) return false;
if(j+1<m) if(abs(v[i+1][j+1]-v[i][j])<=k) return false;
}
return true;
}
int main(){
int n,m,shuzhi;
int x,y,shu;
int num=0;
cin>>m>>n>>shuzhi;
map<int,int>vis;
vector<vector<int>>v(n);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int d;cin>>d;
v[i].push_back(d);
vis[d]++;
}
}
for(int i=0;ai<n;i++)
for(int j=0;j<m;j++)
if(vis[v[i][j]]==1&&eight(v,i,j,shuzhi,n,m)==true) {
num++;
x=j+1;
y=i+1;
shu=v[i][j];
}
if(num==1) printf("(%d, %d): %d\n",x,y,shu);
else if(num==0) cout<<"Not Exist\n";
else cout<<"Not Unique\n";
}