hdu 6055 : Regular polygon (2017 多校第二场 1011) 【计算几何】

红太狼 2021-12-16 09:35 320阅读 0赞

题目链接

有个结论: 平面坐标系上,坐标为整数的情况下,n个点组成正n边形时,只可能组成正方形。

然后根据这个结论来做。

我是先把所有点按照 x为第一关键字,y为第二关键字 排序,然后枚举向量 (p[i]->p[j]) (j>i),只判断这个向量左侧可否存在两个点与它一起构成一个正方形。这样算的结果是,计数每个正方形时,它的靠右和靠下的两条边都会为ans贡献一个单位,所以最后ans要除以2。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int vis[605][605];
  5. struct point
  6. {
  7. int x,y;
  8. bool operator<(const point& rhs)const
  9. {
  10. return x<rhs.x || x==rhs.x&&y<rhs.y;
  11. }
  12. }p[505];
  13. int main()
  14. {
  15. while(~scanf("%d",&n))
  16. {
  17. memset(vis,0,sizeof(vis));
  18. int ans=0;
  19. for(int i=0;i<n;i++)
  20. {
  21. scanf("%d%d",&p[i].x,&p[i].y);
  22. p[i].x+=300,p[i].y+=300;
  23. vis[p[i].x][p[i].y]=1;
  24. }
  25. sort(p,p+n);
  26. for(int i=0;i<n;i++)
  27. for(int j=i+1;j<n;j++)
  28. {
  29. point a=p[i],b=p[j];
  30. int dx=b.x-a.x;
  31. int dy=b.y-a.y;
  32. point c,d;
  33. c.x=a.x-dy,c.y=a.y+dx;
  34. d.x=b.x-dy,d.y=b.y+dx;
  35. if(vis[c.x][c.y]&&vis[d.x][d.y]) ans++;
  36. }
  37. printf("%d\n",ans/2);
  38. }
  39. }

转载于:https://www.cnblogs.com/Just--Do--It/p/7246451.html

发表评论

表情:
评论列表 (有 0 条评论,320人围观)

还没有评论,来说两句吧...

相关阅读