用C写 O(n^2)求解给定 n 个坐标,求其中 3 个坐标能表示一个等腰三角形的组数
时间: 2023-05-25 08:03:04 浏览: 131
C 代码 计算属性,包括角度、面积、质心、圆周、 边长度、内圆、方向、正交中心和质量, 2D 三角形.rar
C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
int count_isosceles_triangles(int coords[][2], int n) {
int count = 0;
for (int i = 0; i < n - 2; i++) {
for (int j = i + 1; j < n - 1; j++) {
for (int k = j + 1; k < n; k++) {
if ((coords[i][0] == coords[j][0] && coords[j][0] == coords[k][0]) ||
(coords[i][1] == coords[j][1] && coords[j][1] == coords[k][1])) {
// 三点共线,不能构成等腰三角形
continue;
}
if ((coords[i][0] == coords[j][0] && coords[i][1] != coords[j][1]) ||
(coords[j][0] == coords[k][0] && coords[j][1] != coords[k][1]) ||
(coords[i][0] == coords[k][0] && coords[i][1] != coords[k][1])) {
// 有两个点的横坐标相同,但纵坐标不同,不能构成等腰三角形
continue;
}
if ((coords[i][1] == coords[j][1] && coords[i][0] != coords[j][0]) ||
(coords[j][1] == coords[k][1] && coords[j][0] != coords[k][0]) ||
(coords[i][1] == coords[k][1] && coords[i][0] != coords[k][0])) {
// 有两个点的纵坐标相同,但横坐标不同,不能构成等腰三角形
continue;
}
int dx1 = coords[i][0] - coords[j][0];
int dy1 = coords[i][1] - coords[j][1];
int dx2 = coords[j][0] - coords[k][0];
int dy2 = coords[j][1] - coords[k][1];
int dx3 = coords[k][0] - coords[i][0];
int dy3 = coords[k][1] - coords[i][1];
if ((dx1 * dx1 + dy1 * dy1 == dx2 * dx2 + dy2 * dy2) ||
(dx1 * dx1 + dy1 * dy1 == dx3 * dx3 + dy3 * dy3) ||
(dx2 * dx2 + dy2 * dy2 == dx3 * dx3 + dy3 * dy3)) {
// 两条边的长度相等,可以构成等腰三角形
count++;
}
}
}
}
return count;
}
int main(void) {
int coords[][2] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}, {2, 0}, {2, 1}};
int n = sizeof(coords) / sizeof(coords[0]);
int count = count_isosceles_triangles(coords, n);
printf("There are %d isosceles triangles.\n", count);
return 0;
}
```
在本代码中,我们使用三重循环遍历所有可能的三点组合。对于每一组三个点,我们检查它们是否共线或者是否有横坐标或纵坐标相等的两个点,并分别计算出三条边的长度是否相等。如果一组三个点可以构成等腰三角形,则计数器加一。最后返回计数器的值,即为答案。
阅读全文