题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805265579229184
题意描述:
给一个n*m的矩阵,要求找到这样一个点:数据只出现过一次(独一无二),而且还与周围8个点(边界点的领点不到8个)的绝对值之差大于tol。
解题思路:
建map记录矩阵每个数值出现的次数,(理论上桶可以起同样的效果,但占据空间不小)
记录出现一次而且满足与邻接点差超过tol的数据,最后判断输出。
ac代码:
#include<stdio.h>
#include<math.h>
#include<map>
using namespace std;
int main()
{
int m,n,tol; //N 行,每行给出 M 个
scanf("%d%d%d",&m,&n,&tol); //超过 TOL
int color[n+2][m+2];
map<int,int>mapp; //第一次用map,好紧张啊
for(int i=0;i<=n+1;i++) //要考虑边界点!!
{
for(int j=0;j<=m+1;j++)
{
if(i==0||j==0||i==n+1||j==m+1)
{
color[i][j]=-1*tol;
continue;
}
scanf("%d",&color[i][j]);
mapp[color[i][j]]++; //意思是 color[i][j] 这个键在map里对应的值增1
}
}
//map<int,int>::iterator it;
//for(it=mapp.begin();it!=mapp.end();it++)
// printf("%d->%d\n",(*it).first,(*it).second);
int flag=0,a,b,c;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
//printf("%d ",color[i][j]);
if(abs(color[i][j]-color[i][j-1])>tol&&abs(color[i][j]-color[i-1][j])>tol&&abs(color[i][j]-color[i][j+1])>tol&&abs(color[i][j]-color[i+1][j])>tol&&abs(color[i][j]-color[i+1][j-1])>tol&&abs(color[i][j]-color[i-1][j+1])>tol&&abs(color[i][j]-color[i+1][j+1])>tol&&abs(color[i][j]-color[i-1][j-1])>tol)
{
if(mapp[color[i][j]]==1) //独一无二~
{
flag++;
a=i,b=j,c=color[i][j];
}
}
}
//printf("\n");
}
if(flag==0)
printf("Not Exist");
else if(flag!=1)
printf("Not Unique");
else
printf("(%d, %d): %d",b,a,c);
return 0;
}