知识点
这道题可以学习的地方还挺多的。
- vector二维数组的表示与初始化
vector<vector<int>> v;
//注意这里的m、n必须要事先输入
v.resize(n,vector<int>(m));
- 求坐标的周围8个坐标
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};
for(int k=0;k<8;k++){
int tx=i+dir[k][0];
int ty=j+dir[k][1];
}
题解
抄还抄不对,唉,,从昨天找bug找到现在Orz
处处是细节…
我自己第一遍写的时候,用的是cin>>n>>m;
因为它的行列正好是相反的。然后借鉴柳神的代码的时候,人家用的cin>>m>>n;
其实最好还是按照一种思路写到底。
受到@纪流汐夜的一点小建议,将
v[i][j] - v[tx][ty] >= 0 - tol && v[i][j] - v[tx][ty] <= tol
改为
abs(v[i][j] - v[tx][ty]) <= tol
这样更简洁一些~
#include <bits/stdc++.h>
using namespace std;
int m,n,tol,x,y;
vector<vector<int>> v;
bool judge(int i,int j){
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};
for(int k=0;k<8;k++){
int tx=i+dir[k][0];
int ty=j+dir[k][1];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&abs(v[i][j] - v[tx][ty]) <= tol){
return false;
}
}
return true;
}
int main()
{
int cnt=0;
cin>>m>>n>>tol;
v.resize(n,vector<int>(m));
map<int,int> mapp;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++){
cin>>v[i][j];
mapp[v[i][j]]++;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++){
if(mapp[v[i][j]]==1&&judge(i,j)==true){
cnt++;
y=j+1;
x=i+1;
}
}
}
if(cnt==1)
cout<<'('<<y<<", "<<x<<')'<<": "<<v[x-1][y-1]<<endl;
else if(cnt==0)
cout<<"Not Exist"<<endl;
else
cout<<"Not Unique"<<endl;
return 0;
}