題意:給定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 的正方形...