C-根据该地区的N三角形的分类



给定n个三角形,侧面a,b,c通过将它们从最小到最大的排序排序,以相同的样式打印它们。完整问题:https://www.hackerrank.com/challenges/small-triangles-large-triangles/problem

在解决方案中,我们有一个称为三角形的结构。它有3个整数A,B,c。制作了一个三角形数组,称为TR,输入将传递给函数sort_by_area。我的方法是在此数组上应用气泡排序。但我不是像普通气泡排序一样比较tr [j]> tr [j 1],而是比较tr [j]和tr [j 1]。现在,如果TR [J]> TR [J 1]的面积:交换。

问题:最终结果是错误的。阵列不正确排序。首先,我认为这是某个地方的错字,所以我重写了代码,但问题仍然存在。

double area (int a, int b, int c)
{
 double  p = (a+b+c)/2;
 return sqrt(p*(p-a)*(p-b)*(p-c));
}
void sort_by_area(triangle* tr, int n) {
/**
* Sort an array a of the length n
*/
int i,j;
double area1, area2;
triangle temp;
for(i = 0; i < n-1;++i)
{ 
    for(j = 0; j < n-i-1; ++j)
    {
        area1 = area(tr[j].a , tr[j].b, tr[j].c);
        area2 = area(tr[j+1].a , tr[j+1].b, tr[j+1].c);
        if(area1 > area2)
        {
            temp = tr[j];
            tr[j] = tr[j+1];
            tr[j+1] = temp;
        } 
    }
}
}

输入:20

23 37 4722 18 558 31 3128 36 4054 62 1131 41 1453 18 5441 38 5555 44 4444 48 1826 41 6520 23 2158 61 5028 56 5620 39 3233 45 4926 41 6231 46 3948 49 6757 33 45

预期输出:22 18 531 41 1420 23 2154 62 1126 41 6558 31 3120 39 3226 41 6244 48 1823 37 4753 18 5428 36 4031 46 3933 45 4957 33 4528 56 5641 38 5555 44 4448 49 6758 61 50

实际输出:22 18 554 62 1131 41 1420 23 2126 41 6520 39 3258 31 3126 41 6223 37 4744 48 1853 18 5428 36 4031 46 3933 45 4957 33 4528 56 5641 38 5555 44 4448 49 6758 61 50

这是我解决这个挑战的解决方案:

double area(triangle t){
    double p = (t.a+t.b+t.c)/2.0;
    return sqrt(p*(p-t.a)*(p-t.b)*(p-t.c));
}
void sort_by_area(triangle* tr, int n) {
    int i,j;
    for(i=0;i<n-1;i++){
        for(j=i+1;j<n;j++){
            if(area(tr[j]) < area(tr[i])){
                triangle temp = tr[i];
                tr[i]=tr[j];
                tr[j]=temp;
            }
        }
    }
}

您对比较三角形的" for"循环的用法是(由三角形,我的意思是三角形的区域):

for(i = 0; i < n - 1; ++i){
    ...
    ...
    for(j = 0; j < n - i - 1; ++j){
        ...
    }
}

仔细观察:您使用的循环无法比较阵列的最后一个元素。

我刚刚即兴您的代码,它有效:

#include < stdio.h >
#include < stdlib.h >
#include < math.h >
struct triangle
{
    int a;
    int b;
    int c;
};
typedef struct triangle triangle;
float area(int a, int b, int c)
{
    float p;
    p = (float)(a + b + c) / 2;
    return sqrt(p * (p - a) * (p - b) * (p - c));
}
void sort_by_area(triangle* tr, int n)
{
    int i, j;
    float area1, area2;
    triangle temp[5];
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - i - 1; j++)
        {
            area1 = area(tr[j].a, tr[j].b, tr[j].c);
            area2 = area(tr[j + 1].a, tr[j + 1].b, tr[j + 1].c);
            if (area1 > area2)
            {
                temp[0] = tr[j];
                tr[j] = tr[j + 1];
                tr[j + 1] = temp[0];
            }
        }
    }
}
int main()
{
    int n;
    scanf("%d", &n);
    triangle* tr = malloc(n * sizeof(triangle));
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d%d", &tr[i].a, &tr[i].b, &tr[i].c);
    }
    sort_by_area(tr, n);
    for (int i = 0; i < n; i++)
    {
        printf("%d %d %dn", tr[i].a, tr[i].b, tr[i].c);
    }
    return 0;
}

@Zümrüd-üAnka的答案编辑,以匹配您在其他地方找到的泡沫。您的循环实际上应该可以正常工作,在这里循环都与您的循环相同。这通过了Hackerrank的测试用例。我认为实际上只是整数部门给您带来了问题。

double area(triangle t){
    double p = (t.a+t.b+t.c)/2.0;
    return sqrt(p*(p-t.a)*(p-t.b)*(p-t.c));
}
void sort_by_area(triangle* tr, int n) {
    int i,j;
    for(i=0;i<n-1;i++){
        for(j=0;j<n-i-1;j++){
            if(area(tr[j]) > area(tr[j+1])){
                triangle temp = tr[j+1];
                tr[j+1]=tr[j];
                tr[j]=temp;
            }
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新