题目描述
找出图中所有像素满足要求的一个像素,并输入其位置和对应像素值,如果不唯一则输出not unique,不存在输出not exist.
题目分析
我们可以使用增量数组,将某个像素8个方向的位置变化描述出来,这有点像广度优先遍历找寻小岛的问题。将8个方向描述出来后,我们就要判断某个位置是否满足要求,满足要求即这8个位置的像素点与像素点的差值都大于TOL。
我们可以看到输出中包含坐标和像素值,则我们最好声明一个结构体,包括像素点的x,y和value。这样方便运算。
我们将每个像素值出现的次数和像素值存入一个map中,像素点出现的次数必须=1才算完全满足条件。
代码
#include <iostream>
#include <vector>
#include <map>
#include <cstdio>
using namespace std;
int M,N,TOL;
vector<vector<int> > v;
int arr[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};
bool judge(int i, int j)
{
for(int k=0; k<8; k++){
int x = i+arr[k][0];
int y = j+arr[k][1];
if(x>=0 && x<N && y>=0 && y<M && v[i][j]-v[x][y]>= 0-TOL && v[i][j]-v[x][y]<=TOL)
return false;
}
return true;
}
int main()
{
int count=0, posX, posY;
cin>>M>>N>>TOL;
v.resize(N, vector<int>(M));
//map存的是像素值及其出现次数,出现次数为1才可
map<int, int> Map;
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
scanf("%d", &v[i][j]);
Map[v[i][j]]++;
}
}
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
if(Map[v[i][j]] == 1 && judge(i, j)==true) // 只有一个符合的
{
count++;
posX = i;
posY = j;
}
}
}
if(count == 1)
{
printf("(%d, %d): %d", posY+1, posX+1, v[posX][posY]);
}
else if(count > 1)
{
printf("Not Unique");
}
else
{
printf("Not Exist");
}
return 0;
}
答题用时18min
Q68——finish√