PAT-乙-1068 1068 万绿丛中一点红 (20 分)
代码
#include <iostream>
#include <map>
#include <math.h>
using namespace std;
const int MAX = 1001;
long long int a[MAX][MAX];
int count = 0;
int row;
int col;
map<long long int, int> mp;
int cal(int n, int m, int TOL) {
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(mp[a[i][j]]==1) {
if(i-1>=0 && j-1>=0) {
if(abs(a[i][j]-a[i-1][j-1])<=TOL) {
continue;
}
}
if(i-1>=0) {
if(abs(a[i][j]-a[i-1][j])<=TOL) {
continue;
}
}
if(i-1>=0 && j+1<n) {
if(abs(a[i][j]-a[i-1][j+1])<=TOL) {
continue;
}
}
if(j-1>=0) {
if(abs(a[i][j]-a[i][j-1])<=TOL) {
continue;
}
}
if(j+1<n) {
if(abs(a[i][j]-a[i][j+1])<=TOL) {
continue;
}
}
if(i+1<n && j-1>=0) {
if(abs(a[i][j]-a[i+1][j-1])<=TOL) {
continue;
}
}
if(i+1<n) {
if(abs(a[i][j]-a[i+1][j])<=TOL) {
continue;
}
}
if(i+1<n && j+1<n) {
if(abs(a[i][j]-a[i+1][j+1])<=TOL) {
continue;
}
}
count++;
row = i;
col = j;
}
}
}
}
int main() {
int m, n, TOL;
cin>>m>>n>>TOL;
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
cin>>a[i][j];
mp[a[i][j]]++;
}
}
cal(n, m, TOL);
if(count==1) {
cout<<"("<<(col+1)<<", "<<(row+1)<<"): "<<a[row][col]<<endl;
} else if(count>1) {
cout<<"Not Unique"<<endl;
} else {
cout<<"Not Exist"<<endl;
}
return 0;
}
注解
1、用map计数。注意map的取值范围,int可能不够。最好用long long int。
2、根据map的结果找到独一无二的点,然后遍历他的n个邻居(n<=8,在边缘时小于8个,要做条件判断),如果均满足阈值差大于给定值(阈值差,要记得取绝对值)则count++。
3、根据count的不同情况输出不同结果。
4、跟其他题目不太一样的是,此题先输入的是列数,后输入行数。要注意细心。