POJ2002

来源:互联网 发布:linux mint 18.2 kde 编辑:程序博客网 时间:2024/05/18 02:06

已知所给点,求正方形个数

1.开始思路是根据任意两点作为正方形一条边,算出第三点,组成直角三角形,再算出第四点组成正方形,数学功底差,计算坐标时用到距离相等,垂直,运算十分复杂。

在网上搜了搜找出了已知两点,计算正方形另外两点的计算方法,只需要简单的加减运算。

已知: (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)

2.用Hash查找,表长开始取得过短,少于10000.

3.未初始化Hash表和stars数组,导致WA


#include<iostream>

using namespace std;


#define LEN 99991 
struct node
{
int x;
int y;
node *next;
};
int search(node **H,int x,int y);
node *HashTable[LEN];
node stars[1000];


int main()
{
int num,i,j,addr,x3,y3,x4,y4,count;
node *p;
cin>>num;
while(num)
{
count=0;
memset(HashTable,0,sizeof(node *)*LEN);
memset(stars,0,sizeof(node)*1000);
for(i=0;i<num;i++)
{
cin>>stars[i].x>>stars[i].y;
addr=(stars[i].x*stars[i].x+stars[i].y*stars[i].y)%LEN;
p=HashTable[addr];
if(!p)
{
HashTable[addr]=&stars[i];
stars[i].next=NULL;
}
else
{
   while(p->next)
                    p=p->next;
p->next=&stars[i];
stars[i].next=NULL;
       }
    }
        for(i=0;i<num-1;i++)
{
for(j=i+1;j<num;j++)
{
x3=stars[i].x+(stars[i].y-stars[j].y);
y3=stars[i].y-(stars[i].x-stars[j].x);
x4=stars[j].x+(stars[i].y-stars[j].y);
y4=stars[j].y-(stars[i].x-stars[j].x);
if(search(HashTable,x3,y3)&&search(HashTable,x4,y4))
                   count++;
x3=stars[i].x-(stars[i].y-stars[j].y);
y3=stars[i].y+(stars[i].x-stars[j].x);
x4=stars[j].x-(stars[i].y-stars[j].y);
y4=stars[j].y+(stars[i].x-stars[j].x);
if(search(HashTable,x3,y3)&&search(HashTable,x4,y4))
                   count++;
}


}
cout<<count/4<<endl;
cin>>num;
}
return 0;


}
int search(node **H,int x,int y)
{
int addr;
node *p;
addr=(x*x+y*y)%LEN;
    p=H[addr];
while(p)
{
if(x==p->x&&y==p->y)
return 1;
p=p->next;
}
return 0;
}
0 0