⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lab_3.c

📁 给定一个集装箱
💻 C
字号:
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <time.h>
#include "graphics.h"


#define PI 3.1415926   

double *x,*y,*r;  //保存圆柱体半径
double W,H,L;//W为集装箱的宽度,H为集装箱的高度,L为集装箱的长度也是圆柱形木材的长度
int n,*flag,first,m=0;
//n为圆柱形木材的个数,数组flag标记来判断是否已放入集装箱,fisrt为第一个可以放置,m为放入的个数

struct Coordinate
{//保存坐标,和半径
    double x0,y0;
    double r0;
};

struct Coordinate Round[40];

void BubbleSort()
{//冒泡排序,半径从大到小排序
    int i,j;
    double temp;
    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if(r[i]<r[j])
            {
                temp=r[i];
                r[i]=r[j];
                r[j]=temp;
            }
}

void Greedy(double x0,double y0,double r0)
{
    int i,j;
    double angle;


    Round[m].x0=x0;
    Round[m].y0=y0;
    Round[m].r0=r0;
    m++;
    //保存坐标位置
    for(i=first;i<n;i++)    
    { /*寻找未放入的木材i */
        if(!flag[i])
        {
            for(angle=-PI/2;angle<=3*PI/2;angle+=0.001)  
            {/*在木材周围寻找可以放入木材i的位置*/
                x[i]=x0+(r0+r[i])*cos(angle);
                y[i]=y0+(r0+r[i])*sin(angle);
                flag[i]=1;
                if(x[i]-r[i]<0||x[i]+r[i]>W||y[i]-r[i]<0||y[i]+r[i]>H)
                {//判断是否超出边界,是则取回圆柱体.
                    x[i]=0;
                    y[i]=0;
                    flag[i]=0;
                    continue;
                }
                for(j=first;j<n;j++)   /*判断是否和已经放入的木材重叠*/
                    if(flag[j]&&j!=i)
                	{
                        if(pow(x[i]-x[j],2)+pow(y[i]-y[j],2)<pow(r[i]+r[j],2))
                        {//重叠则取回圆柱.
                            x[i]=0;
                            y[i]=0;
                            flag[i]=0;
                            break;
                    	}
                	}
                if(flag[i]) break;
            }
            if(flag[i]) Greedy(x[i],y[i],r[i]);//从新放入的圆柱体开始递归
        }
    }
        
}


void Print()
{
    int i;
    for(i=0;i<n;i++)
        printf("%lf  %lf  %lf\n",x[i],y[i],r[i]);
}


void Show ()
{/*图形界面显示函数*/
     int gdriver,gmode,i,j;
     detectgraph(&gdriver,&gmode);
     initgraph(&gdriver, &gmode, "");
     setbkcolor(BLUE);
     setfillstyle(1,WHITE);
     setcolor(WHITE);
     bar(0,0,W*10,H*10);
     for(i=0;i<m;i++)
     {
         j=i+1;
         j=j%8; /* 文件颜色 */
         setfillstyle(1,j);
         setcolor(j);
         getch();
         circle(Round[i].x0*10,Round[i].y0*10,Round[i].r0*10);
     }
}




void main()
{
    int i,gdriver,gmode;
    double area=0;
    FILE *fp;
    clock_t start,end;
    start = clock();/* 开始时时间点 */
    
    if((fp=fopen("c17.txt","rw"))==NULL)/* read .txt */
    {
        printf("Cannot open infile\n");
        return;
    }
    fscanf(fp,"%d %lf %lf %lf",&n,&W,&H,&L);
    r=(double *)malloc(n*sizeof(double));
    x=(double *)malloc(n*sizeof(double));
    y=(double *)malloc(n*sizeof(double));
    flag=(int *)malloc(n*sizeof(int));
    for(i=0;i<n;i++)
    {
        fscanf(fp,"%lf",&r[i]);
        x[i]=0;
        y[i]=0;
        flag[i]=0;
    }

    BubbleSort();
    //Print() ;
    for(i=0;i<n;i++)    /*寻找第一个可以放入容器的木材*/
    {
        if( 2*r[i]<=W && 2*r[i]<=H )
        { 
            first=i;
            flag[i]=1;
            x[i]=r[i];
            y[i]=r[i];
            Greedy(x[i],y[i],r[i]);
            break;
        }
    }
    for(i=0;i<n;i++)
    {
        if(flag[i])
        {
            printf("%lf  %lf  %lf\n",x[i],y[i],r[i]);
            area+=PI*r[i]*r[i];
        }
    }

    printf("The input number is %d \n",m);
    printf("The using percentage of container: %lf\n",area/W/H);
    end = clock();/* 运行后时间点 */
    
    printf("The running time is %lfs\n",(double)(end - start)/CLK_TCK);
    printf("Press any key to look the show!");
    getch();

    Show();
    closegraph();
    fclose(fp);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -