time比較長,1454ms,不過我不在乎了,畢竟我沒那個實力去參加競賽,自然也沒必要糾結時間快慢,不超時,不報錯就行,學會並熟練這個演算法是最好的
給你一堆點,找四個點組成的正方形有多少個。
暴力方法就是列舉4個點看是否構成正方形,但是n有2000個。2000^4明顯超時。
但是2000^2是不會超時的,所以我們可以嘗試列舉2個點來求正方形是否存在
這個幾何好的話很容易的,初中知識就可以應付了吧。
已知2個點,(x1,y1),(x2,y2)
那麼剩下的2個點座標為
x3=x1+y1-y2;
y3=y1+x2-x1;
x4=x2+y1-y2;
y4=y2+x2-x1;
這個自己畫個正方形,推一下很容易就出來啦
所以知道2個點,只要能查詢出剩下兩個點在不在就可以了。
所以關鍵就是查詢剩下的2個點,如果用2個for()來查詢,這樣子和列舉四個點沒什麼區別
於是雜湊表的作用就體現啦!用key值存點,我的key值=x*x+y; 這樣子查詢就特別方便,省去了很多不必要的查詢!
#include#include#include#define m 2005
using namespace std;
int n,px[m],py[m];
struct point
;struct point *hash[m];
void insert(struct point *h,int xx,int yy)
else
insert(h->next,xx,yy);
}int find(int xx,int yy)
}int main()
printf("%d\n",ans);
} return 0;
}
poj 2002 列舉 雜湊
給定n個點,求出這些點一共可以構成多少個正方形。sample input 4 1 00 1 1 10 0 90 0 1 02 0 0 21 2 2 20 1 1 12 1 4 2 5 3 70 0 5 20sample output 1 61可列方程 可以得出 知道兩點求出其餘兩點 x3 node ...
題解 POJ2002 Squares(雜湊表)
題目描述 給出平面上一些點的座標,統計由這些點可以組成多少個正方形。注意 正方形的邊不一定平行於座標軸。輸入 輸入包括多組測試資料。每組的第一行是乙個整數n 1 n 1000 表示平面上點的數目,接下來n行,每行包括兩個整數,分別給出乙個點在平面上的x座標和y座標。輸入保證 平面上點的位置是兩兩不同...
雜湊表的理解
因為在開發中經常用到hashmap,hashset等集合結構,但是一直對其中的hash的意思不太理解。今天抽空查了一下資料,順便記錄一下現在的理解。事先宣告一下,此文只介紹雜湊表的資料結構,不介紹具體的hash演算法 首先我們不要去想hash表是用來幹嘛的,先以實際問題著手。就是現在需要乙個能夠儲存...