回 帖 发 新 帖 刷新版面

主题:我写的装箱子算法( 有谁还能再减少大箱子的数目)

//////////////////////////////////////////////////////////////////////////////////////////////////
// filename     : loadbox.c
// distription  : 想固定的空间装箱子
// date         : 7.27.2006
// edition      : 1.0
//////////////////////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <malloc.h>

#define max 100
#define wide 10

struct box                              //被装入箱子的结构
{
    char name;                          //箱子的名字
    int lenth;                          //箱子的长度
};

void sort( struct box *p[], int n );
void swap( struct box *p1, struct box *p2 );
void delete( struct box *p[], int l, int n );

//////////////////////////////////////////////////////////////////////////////////////////////////
// function     : creatbox
// distription  : 建立好箱子的数目于大小,并进行装入
// argument     : 无
// return       : 无
//////////////////////////////////////////////////////////////////////////////////////////////////

void creatbox( )
{
    int big[max];
    struct box *small[max];
    char c;
    int n;
    int i, j;

    printf( "input the small amount :  ");                              //输入要装箱子的数量
    fflush( stdout );
    scanf("%d", &n);

    for( i = 0; i < n; i++ )                                            //将大箱子的空间清空
    {
        big[i] = 0;
    }

    for( i = 0; i < n; i++ )
    {
        small[i] = ( struct box * )malloc( sizeof( struct box ) );
        if( small[i] == NULL )
        {
            printf( "out of space ! \n" );
            fflush( stdout );
            return;
        }
    }


    printf( "input the name and the lenth  and the lenth must less than 10 \n" );
    fflush( stdout );

    for( i = 0; i < n; i++ )                                            //分配小箱子的形状
    {
        printf( "name,lenth :  \n " );
        fflush( stdout );
        while( ( c = getchar() ) != '\n' )
        {
                ;
        }
        scanf("%c,%d", &small[i]->name, &small[i]->lenth );

        if( small[i]->lenth > wide )
        {
            printf( "must less than 10 " );
            fflush( stdout );
            return;
        }
    }

    sort( small , n );                                                      //将箱子的长度进行排序
    for( i = 0; i < n; i++ )
    {
        printf(" name : %c , lenth : %d \n", small[i]->name, small[i]->lenth );
    }


    for( i = 0; i < n; i++ )                                            //如果其他的箱子刚好于大箱子剩下的空间相符合,则装入
    {
        for( j = n - 1; j > 0; j-- )
        {
            if( big[i] + small[j]->lenth == wide )
            {
                big[i] = big[i] + small[j]->lenth;
                printf("the %c -------> big %d ,lenth: %d ", small[j]->name, i, small[j]->lenth );

                delete( small, j, n );
                n = n - 1;
                break;
            }
            else if( big[i] + small[j]->lenth < wide )                          //其他的不超国大箱子的空间,则可以进入
            {
                big[i] = big[i] + small[j]->lenth;
                printf("the %c -------> big%d , lenth: %d ", small[j]->name, i, small[j]->lenth );

                delete( small, j, n );

                printf( "in " );
                 fflush( stdout );

                n = n - 1;
            }
        }
    }
}

回复列表 (共2个回复)

沙发

//////////////////////////////////////////////////////////////////////////////////////////////////
// function     : sort
// distription  : 将结点出现的次数大小进行排序
// argument     : p 结点指针
// return       : 无
//////////////////////////////////////////////////////////////////////////////////////////////////

void sort( struct box *p[], int n )
{
    int i,j;


    for( i = 0; i < n ; i++ )
    {
        for( j = i; j > 0; j-- )
        {
            if( p[j]->lenth < p[j-1]->lenth )
            {
                swap( p[j], p[j-1] );
            }

        }
    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////
// function     : swap
// distription  : 交换2个结点
// argument     : p1,p2 结点指针
// return       : 无
//////////////////////////////////////////////////////////////////////////////////////////////////

void swap( struct box *p1, struct box *p2 )
{
    struct box tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

//////////////////////////////////////////////////////////////////////////////////////////////////
// function     : delete
// distription  : 删除这个结点
// argument     : p 结点指针 l 删除点的位置 n 长度
// return       : 无
//////////////////////////////////////////////////////////////////////////////////////////////////

void delete( struct box *p[], int j, int n )
{
    int i;

    for( i = j; i < n-1; i++ )
    {
        p[i]->lenth = p[i+1]->lenth;
        p[i]->name  = p[i+1]->name;
    }
    free( p[n-1] );
}

板凳

呵呵,简单的贪心.

我来回复

您尚未登录,请登录后再回复。点此登录或注册