两个要点
1.四周一圈都要比较,大于tol
2.颜色要唯一
思路:
1.先把每个像素点的颜色都存起来,排个序。
2.对每个像素点的一周的像素比较,找出符合要求的点,存到一个vector中
3.对该vector的每个像素点的颜色去查找有无重复的,如果没有就是符合要求的点。
具体来说就是先根据颜色找到第一个索引,看下一个颜色是否相同,相同就说明这个颜色不是唯一的。
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
//scanf printf防止超时
#include <algorithm>
//vector的sort
#include <sstream>
//转换
using namespace std;
#include<iomanip>
//精度
#include<cmath>
//round四舍五入取整
class point
{
public:
int x;
int y;
int color;
};
int photo[1001][1001]={-1};
int main()
{
int m,n,tol;
cin>>m>>n>>tol;
vector<int> colors;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int color;
scanf("%d",&color);
photo[i][j]=color;
colors.push_back(color);
}
}
vector<point> points;
for(int i=1;i<n;i++)
{
for(int j=1;j<m;j++)
{
bool flag=true;
if(j>1)
{
if(abs(photo[i][j]-photo[i][j-1])<=tol)
flag=false;
}
if(i>1)
{
if(abs(photo[i][j]-photo[i-1][j])<=tol)
flag=false;
}
if(j<m)
{
if(abs(photo[i][j]-photo[i][j+1])<=tol)
flag=false;
}
if(i<n)
{
if(abs(photo[i][j]-photo[i+1][j])<=tol)
flag=false;
}
if(i>1&&j>1)
{
if(abs(photo[i][j]-photo[i-1][j-1])<=tol)
flag=false;
}
if(i>1&&j<m)
{
if(abs(photo[i][j]-photo[i-1][j+1])<=tol)
flag=false;
}
if(i<n&&j<m)
{
if(abs(photo[i][j]-photo[i+1][j+1])<=tol)
flag=false;
}
if(i<n&&j>1)
{
if(abs(photo[i][j]-photo[i+1][j-1])<=tol)
flag=false;
}
if(flag)
{
point p;
p.x=i;
p.y=j;
p.color=photo[i][j];
points.push_back(p);
//printf("(%d, %d): %d\n",p.x,p.y,p.color);
}
}
}
sort(colors.begin(),colors.end());
vector<point> res;
for(int i=0;i<points.size();i++)
{
int index;
for(int j=0;j<colors.size();j++)
{
if(colors[j]==points[i].color)
{
index=j;
break;
}
}
bool flag=true;
if(index<colors.size()-1)
{
if(colors[index+1]==points[i].color)
flag=false;
}
if(flag)
res.push_back(points[i]);
}
int count=res.size();
if(count==0)
{
cout<<"Not Exist"<<endl;
}else if(count==1)
{
printf("(%d, %d): %d\n",res[0].y,res[0].x,res[0].color);
}else
{
cout<<"Not Unique"<<endl;
}
return 0;
}
PAT(Basic Level) Practice : 1068 万绿丛中一点红 (20分)
原文:https://www.cnblogs.com/zchq/p/13751722.html