1. 程式人生 > >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、跟其他題目不太一樣的是,此題先輸入的是列數,後輸入行數。要注意細心。

結果

在這裡插入圖片描述