PAT-乙-1068 1068 萬綠叢中一點紅 (20 分)
阿新 • • 發佈:2018-11-03
程式碼
#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、跟其他題目不太一樣的是,此題先輸入的是列數,後輸入行數。要注意細心。