Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查C中的两个盘是否重叠_C_Algorithm_Geometry - Fatal编程技术网

检查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))您需要通过注意if
i
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)打印关键计算的结果-在这种情况下,打印中心之间的距离和半径和的总和,然后检查。这将帮助您确定哪里出了问题。基本编码技术:检查文件打开和读取操作-它们有时会失败。您可以通过注意if
i
j
重叠,您可以记录两个磁盘的重叠。因此,当重叠条件为真时,您应该有两个分配。事实上,我认为这就是问题的原因。假设磁盘1和4(共4个)重叠。您记录1个重叠(共4个),但您从未记录过4与1的重叠。@JonathanLeffler,您的想法解决了这个问题。简单地说,是的(您缺少对
free()
n调用,在
main()
程序中,
discs
数组中指针指向的每个数组一个)。如果您还没有遇到过,并且您所在的平台支持它,那么您应该熟悉它。它会告诉您何时何地泄漏内存。内存泄漏:您多次调用
calloc
获取
discs
,但只调用
free
一次。基本:(1)打印读取的数据,以确保程序看到您认为它看到的内容;(2)打印关键计算的结果-在这种情况下,打印中心之间的距离和半径和的总和,然后检查。这将帮助您确定哪里出了问题。基本编码技术:检查文件打开和读取操作-它们有时会失败。您可以通过注意if
i
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);
}