POJ2002 Squares 計算幾何,二分

2022-02-28 01:18:00 字數 1253 閱讀 4428

給定一堆點,求這些點裡哪些點可以構成正方形,題目給定n<=1000,直接列舉四個點是肯定會超時的,因此要做一些優化。

有公式,已知兩個點在正方形對角,分別是(x1,y1)和(x2,y2),那麼圍成正方形後另外兩個點(x3,y3)和(x4,y4)分別為:

x3 = x2 - (x2 -y1)

y3 = x2 + (x2 -x1)

x4 = x1 - (x2 -y1)

y4 = y1 + (x2 - x1)

那麼我們需要列舉兩個點,最後推算出這兩個點和哪兩個點可以圍成正方形,然後再去檢視剩下的點集裡是否存在這兩個點。我先排序,再做的二分查詢,這個題也可以用hash去做,通過hash可以在o(1)的時間內確定是否存在,更加快捷。特別需要注意的是,假如存在乙個正方形,那麼必然會列舉到這裡面的分別兩條邊。這個時候需要除以2即可。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 

17 #include 18 #include 19

20using

namespace

std;

2122

const

int maxn = 1010

;23 typedef struct

point

26 point(int xx, int

yy) : x(xx), y(yy) {}

27}point;

28int

n, ans;

29point p[maxn];

3031

bool

cmp(point a, point b)

3536

bool bs(int x, int

y) 45

return0;

46}4748

intmain()

56 sort(p, p+n, cmp);

57for(int i = 0; i < n; i++) 65}

66 printf("

%d\n

", ans / 2

);67}68

return0;

69 }

POJ 2002 Squares解題報告

題目大意 給你乙個二維平面上面的n 1000 個點的座標 每個點座標都不超過20000 讓你找出有多少個正方形。給了三秒半 思路 還是先看一眼暴力列舉,4個點的所有可能組合為n 4肯定超時了。列舉每兩個點的組合o n 2 然後看是否存在可以和他們組成正方形的點。即該位置上是否有點 用雜湊表可以將查詢...

題解 POJ2002 Squares(雜湊表)

題目描述 給出平面上一些點的座標,統計由這些點可以組成多少個正方形。注意 正方形的邊不一定平行於座標軸。輸入 輸入包括多組測試資料。每組的第一行是乙個整數n 1 n 1000 表示平面上點的數目,接下來n行,每行包括兩個整數,分別給出乙個點在平面上的x座標和y座標。輸入保證 平面上點的位置是兩兩不同...

POJ 2002 檢查正方形

這道題被分類到 hash 裡面了,我覺得hash的作用就是快速的查詢以來判重和計數 這道題要判斷的是是否存在點和正方形是否被計數過。前者用 map 和 pair 來解決,後者嘛,我只列舉某邊作為上邊的情況,所以,不必擔心拉 列舉每條邊作為正方形上邊時候的情況即可。include include in...