POJ 2002 統計正方形 HASH

2022-08-31 04:06:10 字數 1214 閱讀 8105

題意:給定n個點,問有多少種方法可以組成正方形。

思路:我們可以根據兩個點求出對應正方形[有2個乙個在兩點左邊,乙個在兩點右邊]另外兩個點的左邊。例如

已知:(x1,y1) (x2,y2)

則x3=x1+(y1-y2) y3= y1-(x1-x2) x4=x2+(y1-y2) y4= y2-(x1-x2)

或x3=x1-(y1-y2) y3= y1+(x1-x2) x4=x2-(y1-y2) y4= y2+(x1-x2)

列舉兩個點,進行hash,然後再列舉兩個點然後求另外兩個點,再從hash表找,衝突用拉鍊法。

這種做法會使同乙個正方形按照不同的順序被列舉了四次,因此最後的結果要除以4.

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

intll;

typedef unsigned

intuint

;const

int maxn=1000+5

;const

int mod=99991

;struct

point;

};point p[maxn];

vector

hash[mod];

void

init()

}void

insethash(point a)

bool

search(point a)

}return

false;}

intmain()

for(int i=0;i)

for(int i=0;i)

c.x=p[i].x-(p[i].y-p[j].y); c.y=p[i].y+(p[i].x-p[j].x);

d.x=p[j].x-(p[i].y-p[j].y); d.y=p[j].y+(p[i].x-p[j].x);

if(search(c)&&search(d))}}

printf(

"%d\n

",ans>>2

); }

return0;

}

POJ 2002 檢查正方形

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

poj 2002 HASH判斷正方形

題意 給出一些直角座標系的點,求這些點可以組成多少個正方形。思路 hash 正方形一條邊的兩個點的和,然後求另外兩個點,如果可以找到構成這個正方形的點的話,個數加一 include include define m 1031 using namespace std struct point poin...

leetcode 統計全為 的正方形子矩陣

給你乙個 m n 的矩陣,矩陣中的元素不是 0 就是 1,請你統計並返回其中完全由 1 組成的 正方形 子矩陣的個數。示例 1 輸入 matrix 0,1,1,1 1,1,1,1 0,1,1,1 輸出 15 解釋 邊長為 1 的正方形有 10 個。邊長為 2 的正方形有 4 個。邊長為 3 的正方形...