題目大意:
給你乙個二維平面上面的n(1000)個點的座標(每個點座標都不超過20000),讓你找出有多少個正方形。
給了三秒半····
思路:還是先看一眼暴力列舉,4個點的所有可能組合為n^4肯定超時了。列舉每兩個點的組合o(n^2),然後看是否存在可以和他們組成正方形的點。即該位置上是否有點(用雜湊表可以將查詢過程時間複雜度降為o(1)。
這個雜湊真是猛,只是要根據經驗找個合適的雜湊函式,一定要讓雜湊函式的值分布均勻,不然的話,和就相當於還是在列舉。這道題原本mod為1000的時候3438ms險過。mod改為10000之後,速度瞬間變快只需2469ms用空間換時間很划算。
程式跑快快~
#include#include#include#define n 1050
#define mod 10000
using namespace std;
int n;
struct point
poi[n];
int hash[mod+10]=;
int next[mod+10]=;
void input()
}bool find(point x)
return 0;
}void init()
int main()
} s=s/8;
cout<
題解 POJ2002 Squares(雜湊表)
題目描述 給出平面上一些點的座標,統計由這些點可以組成多少個正方形。注意 正方形的邊不一定平行於座標軸。輸入 輸入包括多組測試資料。每組的第一行是乙個整數n 1 n 1000 表示平面上點的數目,接下來n行,每行包括兩個整數,分別給出乙個點在平面上的x座標和y座標。輸入保證 平面上點的位置是兩兩不同...
POJ2002 Squares 計算幾何,二分
給定一堆點,求這些點裡哪些點可以構成正方形,題目給定n 1000,直接列舉四個點是肯定會超時的,因此要做一些優化。有公式,已知兩個點在正方形對角,分別是 x1,y1 和 x2,y2 那麼圍成正方形後另外兩個點 x3,y3 和 x4,y4 分別為 x3 x2 x2 y1 y3 x2 x2 x1 x4 ...
POJ 2002 檢查正方形
這道題被分類到 hash 裡面了,我覺得hash的作用就是快速的查詢以來判重和計數 這道題要判斷的是是否存在點和正方形是否被計數過。前者用 map 和 pair 來解決,後者嘛,我只列舉某邊作為上邊的情況,所以,不必擔心拉 列舉每條邊作為正方形上邊時候的情況即可。include include in...