📄 零件切割问题.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "draw.h"
struct juxing {
int height;
int board;
};
struct juxing juxinglab[1000];
struct point
{int i;
int j;
} ;
struct tuxing{
struct point a;
struct point d;
};
static unsigned long ezdcolor[15]={
ezdBlue,
ezdTeal,
ezdGreen,
ezdTurquoise,
ezdDarkGray,
ezdBrown,
ezdPurple,
ezdLightBlue,ezdLightGray,
ezdGold,
ezdRed,
ezdOrange,
ezdPink,
ezdYellow,
ezdBlack};
struct tuxing tuxinglab[1000];
void disp( int i,struct juxing juxinglab);
void sort(int N,struct juxing juxinglab[]);
void make(int N,int W,struct tuxing tuxinglab[],struct juxing juxinglab[]);
void picture( int N,int W,struct tuxing tuxinglab[]);
void main(void)
{
int N,W;
int i;
int k;
FILE *fp;
char path[100];
i=-2;
printf("请输入你的文件名\n");
scanf("%s",path);
if((fp=fopen(path,"rt"))==NULL)
{printf("cannot open file any key exit!");
getchar();
exit(1);
}
fscanf(fp,"%d %d",&N,&W);
while(fscanf(fp,"%d %d ",&juxinglab[++i].height,&juxinglab[i].board)!=EOF);
printf("\n");
fclose(fp);
printf("排序前:\n");
for(i=0;i<N;i++)
disp(i,juxinglab[i]);
sort(N,juxinglab);
printf("排序后:\n") ;
for(i=0;i<N;i++)
disp(i,juxinglab[i]);
make(N,W,tuxinglab,juxinglab);
openWindow();
for(k=0;k<N;k++)
picture(N,W,tuxinglab);
viewWindow();
getchar();
closeWindow();
}
void sort( int N, struct juxing juxinglab[])
{
int i,j,k;
struct juxing change;
for(i=0;i<N;i++)
{k=i;
for(j=i+1;j<N;j++)
{if(juxinglab[j].height>juxinglab[k].height)
k=j;
}
if(k!=i)
{ change.height=juxinglab[k].height;
juxinglab[k].height=juxinglab[i].height;
juxinglab[i].height=change.height;
change.board=juxinglab[k].board;
juxinglab[k].board=juxinglab[i].board;
juxinglab[i].board=change.board;
}
}
}
void disp( int i, struct juxing juxinglab)
{
printf("%d\t%d,%d\n",i,juxinglab.height,juxinglab.board);
}
void make( int N, int W,struct tuxing tuxinglab[],struct juxing juxinglab[])
{
int w;
int k;
int h;
int p;
tuxinglab[0].a.i=0;
tuxinglab[0].a.j=0;
tuxinglab[0].d.i=juxinglab[0].board;
tuxinglab[0].d.j=juxinglab[0].height;
printf("%d,%d\t%d,%d\n",tuxinglab[0].a.i,tuxinglab[0].a.j,
tuxinglab[0].d.i,tuxinglab[0].d.j);
w=juxinglab[0].board;
h=juxinglab[0].height;
for(k=1;k<N;k++)
{if((w+=juxinglab[k].board)<=W)
{
p=k;
tuxinglab[k].a.j=tuxinglab[--p].a.j;
tuxinglab[k].a.i=tuxinglab[p].d.i;
tuxinglab[k].d.i=tuxinglab[p].d.i+juxinglab[k].board;
tuxinglab[k].d.j=tuxinglab[p].a.j+juxinglab[k].height;
}
else
{
tuxinglab[k].a.j=h;
tuxinglab[k].a.i=0;
tuxinglab[k].d.i=juxinglab[k].board;
tuxinglab[k].d.j=juxinglab[k].height+h;
w=juxinglab[k].board;
h+=juxinglab[k].height;
continue;
}
}
for(k=1;k<N;k++)
{printf("%d,%d\t%d,%d\n",tuxinglab[k].a.i,tuxinglab[k].a.j,
tuxinglab[k].d.i,tuxinglab[k].d.j);
}
printf("此切割问题的高度为%d\n",h);
}
void picture ( int N,int W,struct tuxing tuxinglab[])
{
int k;
int p;
ezdSetColor(ezdBlue);
if(W>100){
p=W/100+1;
W=W/p;}
else p=1;
;
ezdDrawLine(W, 0, W, 100);
for(k=0;k<N;k++)
{ezdSetColor(ezdcolor[k%15]);
delayWindow(0.1);
ezdDrawRectangle(
tuxinglab[k].a.i/p,
tuxinglab[k].a.j/p,
tuxinglab[k].d.i/p,
tuxinglab[k].d.j/p
);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -