本題為 Brute Force 可以迅速解題。
題目給予一些二維座標,求是否所有點左右對稱。
看似簡單,但需要注意以下幾點,不然很容易拖掉 Debug 時間。
1. scanf 讀取輸入的時候,遇到自定義的 struct,不必遲疑,直接把 “&” 寫在前面:
scanf("%d %d", &a[i].x, &a[i].y);
2. 取 x 最大值和最小值,相加當作中點,不需要除以 2,避免出現浮點數問題。
3. x_min 和 x_max 取完,要馬上回歸初始值。x_min 初始值要是很大的值,x_max 初始值是很小的值。
4. 要考慮座標有可能落在對稱線上,for 迴圈掃過所有點,某一點自己也可以跟自己取中點來做判斷。
完整程式碼:
// This code is created by EdocZec on 2020/01/25 #include <bits/stdc++.h> #define _for(i,a,b) for(int i=(a); i<(b); ++i) // this has been verified and can work correctly. #define _dbg(arr,n) _for(i,0,n){cout << " [Debug] arr[" << i << "] = " << (arr)[i] << endl;} // this has been verified and can work correctly. using namespace std; struct point { int x; int y; }; point a[4000]; int main(int argc, char** argv) { int case_num; scanf("%d", &case_num); _for(i,0,case_num) { int num, x_min = 10001, x_max = -10001, center = 0; scanf("%d", &num); _for(i,0,num) { scanf("%d %d", &a[i].x, &a[i].y); //cout << " [Debug] read a[i].x == " << a[i].x << endl; if((a[i].x) > x_max) x_max = a[i].x; if((a[i].x) < x_min) x_min = a[i].x; a[i].x = a[i].x; a[i].y = a[i].y; } // cout << " [Debug] x_max == " << x_max << endl; // cout << " [Debug] x_min == " << x_min << endl; center = (x_max + x_min); // cout << " [Debug] center == " << center << endl; x_min = 10001; x_max = -10001; // judge bool hit = false; _for(i,0,num) { hit = false; _for(j,0,num) { // cout << " [Debug] a[i].x == " << a[i].x << endl; // cout << " [Debug] a[j].x == " << a[j].x << endl; if( ((a[i].x + a[j].x) == center ) && (a[i].y == a[j].y) ) { hit = true; } } if(!hit) { // cout << " [Debug] not hit." << endl; // cout << " [Debug] a[i].x == " << a[i].x << endl; cout << "NO" << endl; break; } } if(hit) cout << "YES" << endl; } // for each case. return 0; } // above ok, updated on 2020/01/25
留言
張貼留言