[英]Count number of squares from a set of vertices, C++
我有一个C ++代码,用于计算从具有X,Y坐标的给定点集中可以形成多少个正方形。 5点的样本输入如下:
5
0 0
0 2
1 0
2 0
2 2
一个重要的注意事项是,正方形不需要轴对齐。 这是一个工作代码,摘自“ codechef.com”:
int N = 5;
std::vector<int> arr_x{0, 0, 1, 2, 2};
std::vector<int> arr_y{0, 2, 0, 0, 2};
int flag1 = 0;
int flag2 = 0;
int count = 0;
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
flag1 = 0;
flag2 = 0;
int x1 = arr_x[i], y1 = arr_y[i];
int x2 = arr_x[j], y2 = arr_y[j];
int p1_x = x1 - y1 + x2 + y2;
int p2_x = x1 + y1 + x2 - y2;
int p1_y = x1 + y1 - x2 + y2;
int p2_y = -x1 + y1 + x2 + y2;
for (int k = 0; k < N; k++) {
if (2 * arr_x[k] == p1_x && 2 * arr_y[k] == p1_y) {
flag1 = 1;
}
if (2 * arr_x[k] == p2_x && 2 * arr_y[k] == p2_y) {
flag2 = 1;
}
}
if (flag1 && flag2) count++;
}
}
std::cout << count / 2 << std::endl;
我不了解p1_x
, p2_x
, p1_y
, p2_y
的逻辑和含义。 如果有人可以给我解释,请这样做。
第一个循环
for (int i = 0; i < N; i++) {
遍历所有顶点。 第二循环
for (int j = i + 1; j < N; j++) {
在i
之后遍历所有顶点。 该算法假定顶点在对角,并计算两个缺失的顶点。
int p1_x = x1 - y1 + x2 + y2;
int p2_x = x1 + y1 + x2 - y2;
int p1_y = x1 + y1 - x2 + y2;
int p2_y = -x1 + y1 + x2 + y2;
为了避免浮点运算,该计算不太正确。 应为(x1 - y1 + x2 + y2) / 2
。 之后,将顶点乘以2
以纠正此问题。 在最后一个循环中
for (int k = 0; k < N; k++) {
搜索两个缺失的顶点。 如果找到顶点,则设置标志。
if (2 * arr_x[k] == p1_x && 2 * arr_y[k] == p1_y) {
flag1 = 1;
}
if (2 * arr_x[k] == p2_x && 2 * arr_y[k] == p2_y) {
flag2 = 1;
}
}
如果找到两个缺失的顶点,则计算该正方形。
if (flag1 && flag2) count++;
}
}
因为每个平方被计数两次,所以平方数除以2。
std::cout << count / 2 << std::endl;
计算示例:
顶点1是(0,0)。 顶点2为(2,0)。 然后,两个丢失的顶点分别是(1、1)和(1,-1)。 让我们尝试计算:
p1_x = (0 - 0 + 2 + 0) / 2 = 1
p2_x = (0 + 0 + 2 - 0) / 2 = 1
p1_y = (0 + 0 - 2 + 0) / 2 = -1
p2_y = (0 + 0 + 2 + 0) / 2 = 1
结果是两个丢失的顶点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.