PAT-乙-1068 1068 万绿丛中一点红 (20 分)

PAT-乙-1068 1068 万绿丛中一点红 (20 分)
PAT-乙-1068 1068 万绿丛中一点红 (20 分)
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、跟其他题目不太一样的是,此题先输入的是列数,后输入行数。要注意细心。

结果

PAT-乙-1068 1068 万绿丛中一点红 (20 分)