poj2002(Squares)
题目地址:Squares
题目大意;
给你N个坐标顶点,通过连接各个顶点,构成正方形,问最多有多少个正方形。通过不同的顺序构成的正方形视为同一正方形。
解题思路:
O(n^4)超时。这时想通过两个坐标顶点是否可以查找是否构成正方形。
通过三角形全等得:
已知: (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)
通过两个坐标可以确定另外两个坐标。以为属于枚举了四个顶点,所以最后结果应该除以4.
通过hash 将各个顶点存起来。 然后通过x1,x2,y1,y2计算出的x3,y3,x4,y4分别去判断已经存起来的顶点是否存在,如存在即可以构成。
代码1:
Memory: 540K | Time: 1329MS |
链表模拟拉链。
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 using namespace std; 6 7 struct no 8 { 9 int x; 10 int y; 11 } node[1001]; 12 struct map 13 { 14 int x; 15 int y; 16 struct map *next; 17 } *m[2010]; 18 int hash1(int x,int y) 19 { 20 int key=(x*x+y*y)%2000; 21 if (!m[key]) 22 { 23 map *temp=(map *)malloc(sizeof(map)); 24 temp->x=x; 25 temp->y=y; 26 temp->next=NULL; 27 m[key]=temp; 28 } 29 else 30 { 31 map *temp=m[key]; 32 while(temp) 33 temp=temp->next; 34 temp=(map *)malloc(sizeof(map)); 35 temp->x=x; 36 temp->y=y; 37 temp->next=NULL; 38 } 39 } 40 int find(int x,int y) 41 { 42 int key=(x*x+y*y)%2000; 43 if (m[key]) 44 { 45 map *temp=m[key]; 46 while(temp) 47 { 48 if (temp->x==x&&temp->y==y) 49 return 1; 50 temp=temp->next; 51 } 52 } 53 return 0; 54 } 55 int main() 56 { 57 int n; 58 while(scanf("%d",&n)&&n) 59 { 60 int i,j,x3,y3,x4,y4,cas=0; 61 memset(m,0,sizeof(m)); 62 for(i=0; i<n; i++) 63 { 64 scanf("%d%d",&node[i].x,&node[i].y); 65 hash1(node[i].x,node[i].y); 66 } 67 /* 68 (x1,y1) (x2,y2) 69 x3=x1+(y1-y2) y3= y1-(x1-x2) 70 x4=x2+(y1-y2) y4= y2-(x1-x2) 71 x3=x1-(y1-y2) y3= y1+(x1-x2) 72 x4=x2-(y1-y2) y4= y2+(x1-x2)*/ 73 for(i=0; i<n; i++) 74 for(j=0; j<n; j++) 75 { 76 if (j==i) 77 continue; 78 x3=node[i].x+(node[j].y-node[i].y); 79 y3=node[i].y-(node[j].x-node[i].x); 80 x4=node[j].x+(node[j].y-node[i].y); 81 y4=node[j].y-(node[j].x-node[i].x); 82 if (find(x3,y3)&&find(x4,y4)) 83 cas++; 84 x3=node[i].x-(node[j].y-node[i].y); 85 y3=node[i].y+(node[j].x-node[i].x); 86 x4=node[j].x-(node[j].y-node[i].y); 87 y4=node[j].y+(node[j].x-node[i].x); 88 if (find(x3,y3)&&find(x4,y4)) 89 cas++; 90 } 91 printf("%d\n",cas/4); 92 } 93 return 0; 94 }
代码2:
Memory: 180K | Time: 891MS |
数组模拟拉链。
1 #include <algorithm> 2 #include <iostream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cstdio> 7 #include <string> 8 #include <bitset> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <list> 14 //#include <map> 15 #include <set> 16 using namespace std; 17 /***************************************/ 18 #define ll long long 19 #define int64 __int64 20 /***************************************/ 21 const int INF = 0x7f7f7f7f; 22 const double eps = 1e-8; 23 const double PIE=acos(-1.0); 24 const int d1x[]= {0,-1,0,1}; 25 const int d1y[]= {-1,0,1,0}; 26 const int d2x[]= {0,-1,0,1}; 27 const int d2y[]= {1,0,-1,0}; 28 const int fx[]= {-1,-1,-1,0,0,1,1,1}; 29 const int fy[]= {-1,0,1,-1,1,-1,0,1}; 30 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/ 31 /***************************************/ 32 void openfile() 33 { 34 freopen("data.in","rb",stdin); 35 freopen("data.out","wb",stdout); 36 } 37 /**********************华丽丽的分割线,以上为模板部分*****************/ 38 struct Node 39 { 40 int x,y; 41 } node[1001]; 42 const int M=1999; 43 int hash[2000],next[2000]; 44 int hashcode(int x,int y) 45 { 46 int p=0; 47 p=(p<<6)+(x>>6)^(x<<6); 48 p=(p<<6)+(y>>6)^(y<<6); 49 p%=M; 50 if (p<0) 51 p+=M; 52 return p; 53 } 54 int cmp(int x,int y) 55 { 56 int p; 57 int h=hashcode(x,y); 58 for(p=hash[h]; p!=-1; p=next[p]) 59 if (node[p].x==x&&node[p].y==y) 60 return 1; 61 return 0; 62 } 63 int main() 64 { 65 int n; 66 while(scanf("%d",&n)&&n) 67 { 68 int i,j; 69 int x1,x2,x3,x4,y1,y2,y3,y4; 70 memset(hash,-1,sizeof(hash)); 71 for(i=0; i<n; i++) 72 { 73 scanf("%d%d",&node[i].x,&node[i].y); 74 int h=hashcode(node[i].x,node[i].y); 75 next[i]=hash[h]; 76 hash[h]=i; 77 } 78 int cnt=0; 79 for(i=0; i<n; i++) 80 { 81 for(j=i+1; j<n; j++) 82 { 83 x1=node[i].x; 84 x2=node[j].x; 85 y1=node[i].y; 86 y2=node[j].y; 87 x3=x1+(y1-y2); 88 y3=y1-(x1-x2); 89 x4=x2+(y1-y2); 90 y4=y2-(x1-x2); 91 if (cmp(x3,y3)&&cmp(x4,y4)) 92 cnt++; 93 x3=x1-(y1-y2); 94 y3=y1+(x1-x2); 95 x4=x2-(y1-y2); 96 y4=y2+(x1-x2); 97 if (cmp(x3,y3)&&cmp(x4,y4)) 98 cnt++; 99 } 100 } 101 printf("%d\n",cnt/4); 102 } 103 return 0; 104 }
屌丝终有逆袭日,*******。