# Sorting# Geometry# Brute Force

b604 - Center of Symmetry

🔗 前往 ZeroJudge 原題

題目描述

題目給定一組平面上的點,要求判斷這組點是否存在一個對稱中心。如果存在一個點 s (不一定在點集合中),使得對於集合中的每個點 p,都存在一個點 q 在集合中,滿足 p - s = s - q,則該點集合具有對稱中心。

解題思路

解題思路是首先計算所有點的平均座標,作為可能的對稱中心。然後,將點按照 x 座標和 y 座標排序。接著,對於每個點 p,檢查是否存在一個點 q,使得 p 和 q 相對於平均座標對稱。具體來說,檢查 p 的 x 座標減去平均座標的 x 座標是否等於平均座標的 x 座標減去 q 的 x 座標,並且 p 的 y 座標減去平均座標的 y 座標是否等於平均座標的 y 座標減去 q 的 y 座標。如果對於所有點都能找到滿足條件的點,則存在對稱中心,輸出 "yes",否則輸出 "no"。

複雜度分析

  • 時間複雜度: O(n log n)
  • 空間複雜度: O(n)

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
struct pt{
	int x,y;
};
bool cmp(pt xx,pt yy){
	if(xx.x>yy.x||(xx.x==yy.x&&xx.y>yy.y))return 1;
	return 0;
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n;
	while(cin >> n){
		if(n==0)break; 
		pt a[n];
		int xa=0,ya=0,s=1;
		for(int i=0;i<n;++i){
			cin >> a[i].x >> a[i].y;
			a[i].x*=2;
			a[i].y*=2;
			xa+=a[i].x;
			ya+=a[i].y; 
		}
		xa/=n;
		ya/=n;
		sort(a,a+n,cmp);
		for(int i=0;i<n&&s;++i){
			if(a[i].x-xa!=xa-a[n-i-1].x||a[i].y-ya!=ya-a[n-i-1].y){
				s=0;
			}
		}
		if(s){
			cout << "yes\n";
		}
		else{
			cout << "no\n";
		}
	}
}

Discussion