#include
#include
main()
{
int m,n,u,v,Q,q,i,j,M,w,r; /*M是一趟最多能搬运的货物数量,w是按照回程启发式算法需要搬运的趟数,
r在循环体中作为一个标识变量,用来判断车子有没有装满*/
int a[1000]; /*数组a[1000]中的元素表示货物在每排货架上的位置,例如a[0]=8表示第一排货架中货物在第8货位;
由于货架的排数n在输入之前是一个不确定的变量,所以用一个足够大的数字1000来定义数组的长度*/
float X=0,Y=0,X1=0,Y1=0,L,L1,x[1000],y[1000],x1[1000],y1[1000];
/*X表示水平方向搬运总距离,Y表示竖直方向搬运总距离,必须先赋值为0,否则在后面进行自加运算的时候结果错误
x[1000],y[1000]两个数组中的元素分别表示第i趟搬运货物水平方向和竖直方向的搬运距离,例如x[0]=55表示第
1趟搬运货物水平方向搬运距离为55*/
for(i=0; i{
x[i]=0;
y[i]=0;
x1[i]=0;
y1[i]=0;
} /*因为x[1000],y[1000]中的元素也会在后面用到自加运算,所以必须先把各个位置的元素都赋值为0,以免结果错误*/
printf(if(r==M)
break; /*判断车子是否装满,如果已经装满则跳出循环,不继续装*/
if(j%2==0 || j==i*M)
y[i]+=2*a[j]*u/m; /*按照实际搬运的顺序模拟执行,如果下一趟搬运的货物在偶数排货架,
则竖直方向搬运距离直接加上货位所在位置到下方通道距离的两倍,如
果下一趟搬运的货物是本趟搬运的第一个货物,则不管货物是否在偶数排货架,
竖直方向搬运距离都直接加上货位所在位置到下方通道距离的两倍*/
else
{
if(a[j]>a[j-1])
y[i]+=2*(a[j]-a[j-1])*u/m;
} /*另外一种情况,如果下一趟搬运的货物在奇数排货架,则需要
判断奇数排货架上货物位置是否比上一个货物位置远,如果更
远,竖直方向搬运距离加上两个货位距离之差的两倍,否则不
处理,实际中可以理解为车子从这个通道中往回走的时候顺带
装上了下一个货物,所以竖直搬运距离不变*/
r++; /*车子每装上一个货物,r都自加一次,表示车子里多了一个货物*/
printf(;
else
if(j==i*M)
y1[i]+=2*u;
else
if(j%2==0)
if(j=(i+1)*M-1)
y1[i]+=2*a[j]*u/m;
else
y1[i]+=2*u;
r++;
}
x1[i]=3*v+6*v*(int)((j-1)/2);
}
for(i=0; i{
X1+=x1[i];
Y1+=y1[i];
}
L1=X1+Y1;
for(i=0; iprintf(
#include
#include
main()
{
int m,n,u,v,Q,q,i,j,M,w,r; /*M是一趟最多能搬运的货物数量,w是按照回程启发式算法需要搬运的趟数,
r在循环体中作为一个标识变量,用来判断车子有没有装满*/
int a[1000]; /*数组a[1000]中的元素表示货物在每排货架上的位置,例如a[0]=8表示第一排货架中货物在第8货位;
由于货架的排数n在输入之前是一个不确定的变量,所以用一个足够大的数字1000来定义数组的长度*/
float X=0,Y=0,X1=0,Y1=0,L,L1,x[1000],y[1000],x1[1000],y1[1000];
/*X表示水平方向搬运总距离,Y表示竖直方向搬运总距离,必须先赋值为0,否则在后面进行自加运算的时候结果错误
x[1000],y[1000]两个数组中的元素分别表示第i趟搬运货物水平方向和竖直方向的搬运距离,例如x[0]=55表示第
1趟搬运货物水平方向搬运距离为55*/
for(i=0; i{
x[i]=0;
y[i]=0;
x1[i]=0;
y1[i]=0;
} /*因为x[1000],y[1000]中的元素也会在后面用到自加运算,所以必须先把各个位置的元素都赋值为0,以免结果错误*/
printf(if(r==M)
break; /*判断车子是否装满,如果已经装满则跳出循环,不继续装*/
if(j%2==0 || j==i*M)
y[i]+=2*a[j]*u/m; /*按照实际搬运的顺序模拟执行,如果下一趟搬运的货物在偶数排货架,
则竖直方向搬运距离直接加上货位所在位置到下方通道距离的两倍,如
果下一趟搬运的货物是本趟搬运的第一个货物,则不管货物是否在偶数排货架,
竖直方向搬运距离都直接加上货位所在位置到下方通道距离的两倍*/
else
{
if(a[j]>a[j-1])
y[i]+=2*(a[j]-a[j-1])*u/m;
} /*另外一种情况,如果下一趟搬运的货物在奇数排货架,则需要
判断奇数排货架上货物位置是否比上一个货物位置远,如果更
远,竖直方向搬运距离加上两个货位距离之差的两倍,否则不
处理,实际中可以理解为车子从这个通道中往回走的时候顺带
装上了下一个货物,所以竖直搬运距离不变*/
r++; /*车子每装上一个货物,r都自加一次,表示车子里多了一个货物*/
printf(;
else
if(j==i*M)
y1[i]+=2*u;
else
if(j%2==0)
if(j=(i+1)*M-1)
y1[i]+=2*a[j]*u/m;
else
y1[i]+=2*u;
r++;
}
x1[i]=3*v+6*v*(int)((j-1)/2);
}
for(i=0; i{
X1+=x1[i];
Y1+=y1[i];
}
L1=X1+Y1;
for(i=0; iprintf(