hdu6055 17多校二1011 Regular polygon

来源:互联网 发布:数据科学入门 编辑:程序博客网 时间:2024/06/08 12:19

读题的题目


Problem Description
On a two-dimensional plane, give you n integer points. Your task is to figure out how many different regular polygon these points can make.
 
没有看到integer points (韩宗上身

一直在想怎么去求多边形的个数

如果是整数点的话

能构成的正多边形只能是正方形

在一堆点里求正方形个数是老题目

比如poj2002 

#include <iostream>  #include <cstdio>  #include <algorithm>  using namespace std;    const int N = 1010;  const int H = 10007;  int ptx[N], pty[N];    struct Node  {      int x;      int y;      int next;  };  Node node[N];  int cur;  int n;  long ans;  int hashTable[H];    void initHash()  {      for (int i = 0; i < H; ++i) hashTable[i] = -1;      cur = 0;      ans = 0;  }    void insertHash(int x, int y)  {      int h = (x * x + y * y) % H;      node[cur].x = x;      node[cur].y = y;      node[cur].next = hashTable[h];      hashTable[h] = cur;      ++cur;  }    bool searchHash(int x, int y)  {      int h = (x * x + y * y) % H;      int next;      next = hashTable[h];      while (next != -1)      {          if (x == node[next].x && y == node[next].y) return true;          next = node[next].next;      }      return false;  }    int main()  {      while (scanf("%d", &n) != EOF && n)      {          initHash();          for (int i = 0; i < n; ++i)           {              scanf("%d%d", &ptx[i], &pty[i]);              insertHash(ptx[i], pty[i]);          }          for (int i = 0; i < n; ++i)          {              for (int j = i + 1; j < n; ++j)              {                  int x1 = ptx[i] - (pty[i] - pty[j]);                  int y1 = pty[i] + (ptx[i] - ptx[j]);                  int x2 = ptx[j] - (pty[i] - pty[j]);                  int y2 = pty[j] + (ptx[i] - ptx[j]);                  if (searchHash(x1, y1) && searchHash(x2, y2)) ++ans;              }          }          for (int i = 0; i < n; ++i)          {              for (int j = i + 1; j < n; ++j)              {                  int x1 = ptx[i] + (pty[i] - pty[j]);                  int y1 = pty[i] - (ptx[i] - ptx[j]);                  int x2 = ptx[j] + (pty[i] - pty[j]);                  int y2 = pty[j] - (ptx[i] - ptx[j]);                  if (searchHash(x1, y1) && searchHash(x2, y2)) ++ans;              }          }          ans >>= 2;          printf("%ld\n", ans);      }      return 0;  }  


原创粉丝点击