1. 程式人生 > >【資料結構查詢】POJ2002——判斷座標點組成正方形的個數

【資料結構查詢】POJ2002——判斷座標點組成正方形的個數

問題描述:

給定二維座標軸上面的座標點,求出它們一共可以組成多少個正方形

求解方法:

將他們按照橫座標由小到大排列(相等則按照縱座標排列),然後遍歷取出其中的兩個點,根據兩個點縱座標的大小關係和兩個點的座標可以推斷出如果組成正方形需要的另外兩個點的座標,並用二分查詢在陣列中查詢,如果可以的話則組成一個正方形。

易錯點:

假設我們認為x1<x2<x3<x4x_1<x_2<x_3<x_4,那麼其實我們將一開始的兩個點x1,x2x_1,x_2x

1,x3x_1,x_3的組合都算了一遍,所以最後結果應該除以2。

AC程式碼如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct point
{
	int x,y;
	bool operator <(const point &A)const
	{
		return (x<A.x)||(x==A.x&&y<A.y);
	}
}p[1000+5
]; int main() { int n; while(scanf("%d",&n)&&n!=0) { int ans=0; for(int i=1;i<=n;i++) { scanf("%d%d",&p[i].x,&p[i].y); } sort(p+1,p+1+n); for(int i=1;i<=n-1;i++) { for(int j=i+1;j<=n;j++) { int x1=p[i].x; int x2=p[j].x; int y1=p[i].y; int
y2=p[j].y; point tmp; if(y1<=y2) { tmp.x=x1+y2-y1; tmp.y=y1+x1-x2; if(!binary_search(p+1,p+1+n,tmp)) continue; tmp.x=x2+y2-y1; tmp.y=y2+x1-x2; if(binary_search(p+1,p+1+n,tmp)) ans++; } else { tmp.x=x1+y1-y2; tmp.y=y1+x2-x1; if(!binary_search(p+1,p+1+n,tmp)) continue; tmp.x=x2+y1-y2; tmp.y=y2+x2-x1; if(binary_search(p+1,p+1+n,tmp)) ans++; } } } cout<<ans/2<<endl; } return 0; }