正方形個數

2021-07-30 21:06:24 字數 2396 閱讀 2913

題目描述

給定n個點,求可以組成的正方形的個數。(這些正方形可以傾斜)

資料範圍:n<=1000,點的座標<=20000

輸入格式

1811.in

有多組測試資料。

對於每一組資料:

第1行為乙個整數n。表示點的個數

第2至n+1行,每行兩個數xi,yi,表示每個點的座標。

當n=0時,輸入結束。

輸出格式

1811.out

對於每組資料,輸出乙個整數。為組成正方形的個數

輸入樣例

1811.in

41 0

0 11 1

0 09

0 01 0

2 00 2

1 22 2

0 11 1

2 14

-2 5

3 70 0

5 20

輸出樣例

1811.out16

1一直覺得雜湊是乙個很神奇的東西,特別是做了這題以後。

我們想了想,收到解方程那題的啟發,於是決定列舉兩個點,因為得出兩個點以後,另外與之構成正方形的兩個點就能很容易地算出來。

分類討論:正正方形,斜正方形。

正正方形(畫得有點醜 嘻嘻):

(懶得畫樣例,乾脆自己舉乙個例子)在乙個平面直角座標系中,如果列舉出兩個點,乙個點a(1,0),b(3,0),如果要和這兩個點構成乙個正方形,要怎麼取。

很容易知道,這個正方形的邊長為2,所以,另外兩個點就為(1,2)和(3,2)。但是,可能會想到也可以是(1,-2)啊。那麼情況豈不是挺多的。這種正方形就交給下面的兩個點(1,-2)和(3,-2)去考慮就好了。

手繪(不錯吧)

這麼快就完了嗎?想多了。還有另外一種情況,打斜著放,當初lgj和我們說全都是打正的時候,天真無邪的我們還相信了,然而最後乙個樣例。。。

再畫乙個圖:

得出a b以後,c d兩個點的橫縱座標就出來了,cd橫座標分別是ab的橫座標減ab縱座標的差,cd縱座標是ab的縱座標加ab橫座標的和。

至於其他各個邊的各種斜的情況,還是暫時不考慮,只考慮列舉到的點i的橫縱座標分別比j小。

一開始我們用一種很暴力很暴力的方法,輸入的時候,把有的點v[x][y]記為1。列舉兩個點以後,得出另外兩個點,如果另外兩個點都存在的話,ans就++。 但是題目的資料點的座標有到20000,,沒辦法,就開了乙個3000的二維陣列,撞撞運氣。

不過要注意,有負數,最好位移一下,然後又很隨便地位移了1000位。

一交,竟然有95分(注意滿分可是100分,不是200),特別神奇,也不知道是不是smoj的資料(同學出的)太水了。

不過嘛,騙分還是不太道德的。後來,把它換成了線性探測。用這個點的橫座標%prime作為位址,記錄x和y,然後找。

不過超時了一大堆,可能是因為衝突太多。後來在網上查到,解決負數的方法可以用平方,畢竟我們也不知道最大的負座標是多少(題目沒說)。以橫縱座標的平方和作為位址。

這樣做的好處是,減少很多衝突?

#include

#include

#include

#include

using namespace std;

int n,ans,prime=1069;

struct ee

a[1100];

struct hh

hash[1100];

void find(int now,int x1,int y1)

hash[add].x1=x1;

hash[add].y1=y1;

hash[add].count++;

} int cheak(int now,int x1,int y1)

return hash[add].count;

}int main()

for(int i=1;i<=n;i++)

{ for(int j=1;j<=n;j++)

{if(i==j) continue;

if(a[i].y==a[j].y&&a[i].x

**寫得不太好,有些地方太長了,容易出錯,不妨寫乙個函式算每個數的平方?ps:第一次在這裡正式上傳總結,多多指教

正方形等分計數總正方形數

如下圖正方形,邊長是1cm,每邊被四等分,求一共分出了多少個正方形。經過手工數 邊長為1 4的正方形 16 邊長為1 2的正方形 9 邊長為3 4的正方形 4 邊長為1的正方形 1 所以一共是 30個正方形。當上述的正方形,邊長被3等分的情況又如何 還是手動數 邊長為1 3的正方形 9 邊長為2 3...

判斷正方形

隨機輸入四個點座標,判斷是否為正方形 編寫乙個程式,輸入為平面上的四個點a x1,y1 b x2,y2 c x3,y3 d x4,y4 編寫程式判斷這四個點能不能組成乙個正方形,可以只說思路,不用寫 include using namespace std int main 儲存點座標 int dis...

最大正方形

題目鏈結 在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。輸入格式 輸入檔案第一行為兩個整數n,m 1 n,m 100 接下來n行,每行m個數字,用空格隔開,0或1.輸出格式 乙個整數,最大正方形的邊長 輸入樣例 1 複製 4 4 0 1 1 1 1 1 1 0 0 1 1...