2017多校联合第二场 1011题 hdu 6055 Regular polygon 计算几何
2017-07-28 11:19
686 查看
题目链接
题意:
给若干个格点,问共能组成多少个正多边形
思路:
要知道一个结论,格点正多边形只有正方形(参见 https://www.zhihu.com/question/36825484/answer/69182031)
于是两两点对枚举,作为正方形的对角线,
最后 个数 / 4 即为答案
AC代码如下:
#include <cstdio>
#include <cmath>
#include <cstring>
#define mod 1000000007
#define maxn 510
const double pi = 3.1415926;
const double eps = 1e-6;
using namespace std;
typedef long long LL;
char s1[maxn], s2[maxn];
int kas, n, m;
struct point { int x, y; }a[maxn];
bool exist[maxn][maxn];
int tot[maxn];
int abs(int a, int b) { return a > b ? a - b : b - a; }
bool ok(double x, int& y) {
if (fabs(x - floor(x)) < eps) { y = floor(x); return true; }
if (fabs(ceil(x) - x) < eps) { y = ceil(x); return true; }
return false;
}
void work() {
int ans = 0;
memset(exist, 0, sizeof(exist));
for (int i = 0; i < n; ++i) {
scanf("%d%d", &a[i].x, &a[i].y);
a[i].x += 100; a[i].y += 100;
exist[a[i].x][a[i].y] = true;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (i == j) continue;
point p1 = a[i], p2 = a[j];
point ori = p1, ne = p2;
int dx = ne.x - ori.x, dy = ne.y - ori.y;
double midx = (double)(ori.x + ne.x) / 2, midy = (double)(ori.y + ne.y) / 2;
double hfdx = (double)(-dy) / 2, hfdy = (double)(dx) / 2;
int x1, y1, x2, y2;
double xa = midx + hfdx, ya = midy + hfdy,
xb = midx - hfdx, yb = midy - hfdy;
bool flag1 = ok(xa, x1), flag2 = ok(xb, x2),
flag3 = ok(ya, y1), flag4 = ok(yb, y2);
if (!flag1 || !flag2 || !flag3 || !flag4) continue;
// printf("%d %d %d %d\n", x1, y1, x2, y2);
if (x1 < 0 || y1 < 0 || x2 < 0 || y2 < 0) continue;
if (exist[x1][y1] && exist[x2][y2]) ++ans;
}
}
printf("%d\n", ans / 4);
}
int main() {
while (scanf("%d", &n) != EOF) work();
return 0;
}
之后的碎碎念:
还是第一次写几何题呢0 0
不过觉得是最简单的哪种类型的了...
一开始枚举正多边形的边数,在那边用向量和矩阵旋转(想到这个的时候还觉得自己很机智((。
后来准备编几组测试数据的时候...莫名觉得好像只可能是正方形Orz
以及判断一个double型的数是不是整数也一直出了很多问题一直调不知道发生了啥...
不知道为啥下取整用强制类型转换成 int 会出问题0 0
还有就是代码风格太差劲了,
好几处用了之前用过的变量...
还忘了将exist数组给memset...
就觉得十分抱歉这样一道题写了这么久(望天
题意:
给若干个格点,问共能组成多少个正多边形
思路:
要知道一个结论,格点正多边形只有正方形(参见 https://www.zhihu.com/question/36825484/answer/69182031)
于是两两点对枚举,作为正方形的对角线,
最后 个数 / 4 即为答案
AC代码如下:
#include <cstdio>
#include <cmath>
#include <cstring>
#define mod 1000000007
#define maxn 510
const double pi = 3.1415926;
const double eps = 1e-6;
using namespace std;
typedef long long LL;
char s1[maxn], s2[maxn];
int kas, n, m;
struct point { int x, y; }a[maxn];
bool exist[maxn][maxn];
int tot[maxn];
int abs(int a, int b) { return a > b ? a - b : b - a; }
bool ok(double x, int& y) {
if (fabs(x - floor(x)) < eps) { y = floor(x); return true; }
if (fabs(ceil(x) - x) < eps) { y = ceil(x); return true; }
return false;
}
void work() {
int ans = 0;
memset(exist, 0, sizeof(exist));
for (int i = 0; i < n; ++i) {
scanf("%d%d", &a[i].x, &a[i].y);
a[i].x += 100; a[i].y += 100;
exist[a[i].x][a[i].y] = true;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (i == j) continue;
point p1 = a[i], p2 = a[j];
point ori = p1, ne = p2;
int dx = ne.x - ori.x, dy = ne.y - ori.y;
double midx = (double)(ori.x + ne.x) / 2, midy = (double)(ori.y + ne.y) / 2;
double hfdx = (double)(-dy) / 2, hfdy = (double)(dx) / 2;
int x1, y1, x2, y2;
double xa = midx + hfdx, ya = midy + hfdy,
xb = midx - hfdx, yb = midy - hfdy;
bool flag1 = ok(xa, x1), flag2 = ok(xb, x2),
flag3 = ok(ya, y1), flag4 = ok(yb, y2);
if (!flag1 || !flag2 || !flag3 || !flag4) continue;
// printf("%d %d %d %d\n", x1, y1, x2, y2);
if (x1 < 0 || y1 < 0 || x2 < 0 || y2 < 0) continue;
if (exist[x1][y1] && exist[x2][y2]) ++ans;
}
}
printf("%d\n", ans / 4);
}
int main() {
while (scanf("%d", &n) != EOF) work();
return 0;
}
之后的碎碎念:
还是第一次写几何题呢0 0
不过觉得是最简单的哪种类型的了...
一开始枚举正多边形的边数,在那边用向量和矩阵旋转(想到这个的时候还觉得自己很机智((。
后来准备编几组测试数据的时候...莫名觉得好像只可能是正方形Orz
以及判断一个double型的数是不是整数也一直出了很多问题一直调不知道发生了啥...
不知道为啥下取整用强制类型转换成 int 会出问题0 0
还有就是代码风格太差劲了,
好几处用了之前用过的变量...
还忘了将exist数组给memset...
就觉得十分抱歉这样一道题写了这么久(望天
相关文章推荐
- hdu 6055 : Regular polygon (2017 多校第二场 1011) 【计算几何】
- (2017多校2)1011/hdu-6055 Regular polygon(计算几何)
- HDU 2017 多校联合训练赛2 1011 6055 Regular polygon map&pair
- HDU 6055 (2017 多校训练赛2 1011)Regular polygon
- HDU 6055 Regular polygon(计算几何+思维)——2017 Multi-University Training Contest - Team 2
- hdu 4617 2013多校联合训练第二场weapon简单的计算几何
- (2017多校训练第二场)HDU - 6055 & POJ - 2002 Regular polygon 哈希
- 2017 多校训练第二场 HDU 6055 Regular polygon
- 【2017多校训练2+计算几何+板】HDU 6055 Regular polygon
- 17 多校 - 2 - 1011 - Regular polygon (HDU - 6055)
- 2017多校联合第二场 1001题 hdu 6045 Is Derek lying?
- HDU 6055 Regular polygon (计算几何 + 国家队论文结论)
- 【2017多校第二场】HDU 6055 Regular polygon【几何,枚举】
- hdu 6127 : Hard challenge (2017 多校第七场 1008)(计算几何)
- Regular polygon(2017多校联赛2。 计算几何)
- 2017 杭电多校联赛第二场 1011 Regular polygon(多个点求正方形个数)POJ 2002
- HDU 2017 多校联合训练赛8 1011 6143 Killer Names 排列组合
- hdu 4629 计算几何 扫描线 (2013多校联合)
- HDU 4643 GSM 简单计算几何 (2013多校联合)
- HDU 5733 tetrahedron(计算几何)【多校联合】