c - 天际算法混淆

时间:2014-05-27 09:41:37

标签: c algorithm

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

#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

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

1 个答案:

答案 0 :(得分:0)

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

#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;
}