我正在尝试编写一个给出天际线角坐标的代码,这是我朋友的作业之一,我正在尝试将其作为一种练习。所以,这是我的代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct building
{
    int start, height, width;
} BUILDING;


int main()
{
    FILE *buildingsptr, *outlineptr;
    char karakter;
    int satir = 1, i = 0, j = 0, *heights, lastpoint = 0 ;
    BUILDING *ptr, *a, temp;

    buildingsptr = fopen("buildings.txt", "r");

    if (buildingsptr == NULL)
    {
        printf("An error occured while opening the file.\n");
        system("PAUSE");
        return 0;
    }
    while ((karakter = fgetc(buildingsptr)) != EOF)
    {
        if (karakter == '\n') satir++;
    }

    ptr = (BUILDING *) malloc(satir * sizeof(BUILDING));

    a = ptr;

    rewind(buildingsptr);

    for (i = 0; i < satir; i++)
    {
        fscanf(buildingsptr, "%d %d %d", &ptr->start, &ptr->height, &ptr->width);
        ptr++;
    }
    fclose(buildingsptr);
    ptr = a; // a is for accessing the first part of the allocated memory,
             // compiler gave some errors while I tried to access the first
             // block of the array.

    for (j = 0; j < satir; j++) //bubble sort to buildings
    {
        for (i = 0; i < satir; i++)
        {
            if (ptr[i].start > ptr[i + 1].start)
            {
                temp = ptr[i];
                ptr[i] = ptr[i + 1];
                ptr[i + 1] = temp;
            }//end of if
        }//end of second for
    }//end of first for

    lastpoint = ((ptr[satir - 1].start + ptr[satir - 1].width) + 1);
    heights = (int *)calloc(lastpoint, sizeof(int));


    for (j = 0; j < lastpoint; j++) // j travels the x axis
    {
        for (i = 0; i < satir; i++) // i counts buildings
        {
            if (j <= (ptr[i].start + ptr[i].width && ptr[i].start <= j))
            {
                if (ptr[i].height > heights[i])
                    heights[i] = ptr[i].height;
            }
        }
    }

    outlineptr = fopen("outline.txt", "w");

    for (i = 0; i < lastpoint; i++) // for every point x,checking the heights
                                    // and transforming them as the coordinates
    {
        if (heights[i + 1] > heights[i])
        {
            fprintf(outlineptr, "(%d,%d),", i + 1, heights[i]);
            fprintf(outlineptr, "(%d,%d),", i + 1, heights[i + 1]);
        }//end if
        if (heights[(i + 1)] < heights[i])
        {
            fprintf(outlineptr, "(%d,%d),", i, heights[i]);
            fprintf(outlineptr, "(%d,%d),", i, heights[i + 1]);
        }//end if
    }//end for
    fprintf(outlineptr, "(%d,%d),", lastpoint, heights[lastpoint]);
    fprintf(outlineptr, "(%d,%d)", lastpoint, 0);

    getch();
    return 0;
}


代码正在运行,但是正在向outline.txt中写入错误的坐标。 “ buildings.txt”类似于:

24 7 4
5 7 11
26 9 7
9 5 5
3 12 4
33 9 6
37 5 7
12 9 10


第一个整数是建筑物的起点,第二个整数是建筑物的高度,第三个整数是建筑物的宽度。那么,如何重新编写此代码?我编辑了代码以使其更正确。

最佳答案

这是程序框架外观的基本示例。
算法本身的实现应由您决定。
无需单独的行计数。

#include <stdio.h>
#include <stdlib.h>

typedef struct building
{
    int start, height, width;
    struct building *next;
    struct building *prev;
} BUILDING;


int main()
{
    FILE *inputFilePtr;
    inputFilePtr = fopen("input.txt", "r");
    if (inputFilePtr == NULL)
    {
        printf("An error occured while opening the file.\n");
        return EXIT_FAILURE;
    }

    struct building *build = malloc(sizeof(*build));
    struct building *reserve = build;
    reserve->prev = NULL;
    build->prev = NULL;
    char lineBuf[1024];
    while (fgets(lineBuf, 1024, inputFilePtr) != NULL)
    {
        sscanf(lineBuf, "%d %d %d", &(build->start), &(build->height), &(build->width));
        build->next = malloc(sizeof(*build));
        build->prev = build;
        build = build->next;
    }
    build->next = NULL;
    fclose(inputFilePtr);


    /////////
    // whatever logic comes here
    ////////

    FILE *out = fopen("out.txt","w");
    if (out == NULL) return EXIT_FAILURE;

    // modify output function to fit your algorithm
    while(reserve->next != NULL)
    {
        fprintf(out, "Build coordinates: (%d, %d, %d)\n", reserve->start, reserve->height, reserve->width);
        reserve->prev = reserve;
        reserve = reserve->next;
    }
    fclose(out);

    // possible memory cleanup
    /*
    while(reserve->prev != NULL)
    {
        reserve = reserve->prev;
        free(reserve->next);
    }
    */
    return 0;
}

关于c - c-天际线算法困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23886056/

10-11 17:47