检查C中的两个盘是否重叠
我必须输出非重叠光盘的数量。据说,如果至少有一个点重叠(它们接触),两个圆盘就会重叠。我使用的重叠条件:检查C中的两个盘是否重叠,c,algorithm,geometry,C,Algorithm,Geometry,我必须输出非重叠光盘的数量。据说,如果至少有一个点重叠(它们接触),两个圆盘就会重叠。我使用的重叠条件: 第一个输入是我应该从键盘读取的光盘数量。接下来的n行输入包含三个整数,即x、y坐标和该圆的半径。 问题是我的输出不正确,我尝试了各种条件来检查光盘是否重叠,但每次都得到不同的结果。例如,当输入以下数据时,输出为5,而应为3 10 05 1 7 1 603 -12 9 10 8 6 534 3.2.2 7-107 3152 -9-7 7 #包括 #包括 #包括 int**readDiscs(i
第一个输入是我应该从键盘读取的光盘数量。接下来的n行输入包含三个整数,即x、y坐标和该圆的半径。
问题是我的输出不正确,我尝试了各种条件来检查光盘是否重叠,但每次都得到不同的结果。例如,当输入以下数据时,输出为5,而应为3 10
05
1 7 1
603
-12 9 10
8 6
534
3.2.2
7-107
3152
-9-7 7
#包括
#包括
#包括
int**readDiscs(int n)//将光盘数据读入阵列
{
int**discs=(int**)calloc(n,sizeof(int*);
对于(int i=0;i 如果(sqrt(pow(X2-X1,2)+pow(Y2-Y1,2))您需要通过注意ifi
和j
重叠来修复搜索,您应该记录两个磁盘的重叠情况。因此,当重叠条件为真时,您应该有两个赋值
假设磁盘1和4(共4个)重叠,但磁盘2和磁盘3都不与任何磁盘重叠。您记录1重叠(共4个),但您从不记录4与1的重叠。您需要通过注意,如果i
和j
重叠,您应该记录两个磁盘的重叠。因此,当重叠条件为真时,您应该有两个分配
假设磁盘1和4(共4个)重叠,但磁盘2和磁盘3均不与任何磁盘重叠。您记录1重叠(与4个重叠),但从未记录4重叠与1个重叠。您存在内存泄漏:您多次调用calloc
以查看磁盘,但仅调用free
一次。基本:(1)打印读取的数据,以确保程序看到您认为它看到的内容;(2)打印关键计算的结果-在这种情况下,打印中心之间的距离和半径和的总和,然后检查。这将帮助您确定哪里出了问题。基本编码技术:检查文件打开和读取操作-它们有时会失败。您可以通过注意ifi
和j
重叠,您可以记录两个磁盘的重叠。因此,当重叠条件为真时,您应该有两个分配。事实上,我认为这就是问题的原因。假设磁盘1和4(共4个)重叠。您记录1个重叠(共4个),但您从未记录过4与1的重叠。@JonathanLeffler,您的想法解决了这个问题。简单地说,是的(您缺少对free()
的n调用,在main()
程序中,discs
数组中指针指向的每个数组一个)。如果您还没有遇到过,并且您所在的平台支持它,那么您应该熟悉它。它会告诉您何时何地泄漏内存。内存泄漏:您多次调用calloc
获取discs
,但只调用free
一次。基本:(1)打印读取的数据,以确保程序看到您认为它看到的内容;(2)打印关键计算的结果-在这种情况下,打印中心之间的距离和半径和的总和,然后检查。这将帮助您确定哪里出了问题。基本编码技术:检查文件打开和读取操作-它们有时会失败。您可以通过注意ifi
和j
重叠,您可以记录两个磁盘的重叠。因此,当重叠条件为真时,您应该有两个分配。事实上,我认为这就是问题的原因。假设磁盘1和4(共4个)重叠。您记录1个重叠(共4个),但您从未记录过4与1的重叠。@JonathanLeffler,您的想法解决了这个问题。简单地说,是的(您缺少对free()
的n调用,在main()
程序中,discs
数组中指针指向的每个数组一个)。如果您还没有遇到,并且您所在的平台支持它,那么您应该熟悉它。它将告诉您何时何地泄漏内存。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int **readDiscs(int n) //reading discs data into array
{
int **discs = (int **) calloc(n, sizeof(int *));
for (int i = 0; i < n; i++)
{
discs[i] = (int *) calloc(3, sizeof(int));
for (int j = 0; j < 3; j++)
scanf("%d", &discs[i][j]);
}
return (discs);
}
int checkOverlap(int **discs, int length)
{
int *overlaps = (int *) calloc(length, sizeof(int));
int k = 0, R1, R2, X1, X2, Y1, Y2;
for (int i = 0; i < length; i++)
for (int j = i + 1; j < length; j++)
{
R1 = discs[i][2];
R2 = discs[j][2];
X1 = discs[i][0];
X2 = discs[j][0];
Y1 = discs[i][1];
Y2 = discs[j][1];
if (sqrt(pow(X2 - X1, 2) + pow(Y2 - Y1, 2)) <= (R1 + R2)) //if the distance is less or equal to radius,
overlaps[i] = 1; //then they overlap or at least touch
}
for (int f = 0; f < length; f++)
if (overlaps[f] == 0)
k++;
free(overlaps);
return (k);
}
int main(int argc, char *argv[])
{
int **discs;
int n;
scanf("%d", &n);
discs = readDiscs(n);
printf("%d\n", checkOverlap(discs, n));
free(discs);
return (0);
}