我正在从事一个项目,该项目要求我查找单个盒子中可以容纳的物品数量。所有项目都是相同的,具有相同的尺寸。我需要计算项目是否可堆叠和/或可翻转的数量。 我看到了很多背包算法,但都涉及不同尺寸的物品和重量。这是我的代码。堆叠允许堆叠物品,如果不可堆叠,则只能在Z轴上放置一件物品。 flip是在项目的6个方向之间切换,它以5到0开头,我每次尝试翻转并尝试放置。我的问题是物品重叠,并且没有堆叠的翻盖给出了错误的数字。感谢进阶
private int Calculate(int X,int Y,int Z,int Xb,int Yb,int Zb,Boolean stack,int flip)
{
int result = 0;
if ((X > Xb || Y > Yb || Z > Zb )&& flip == 0) { return 0; }
else
{
int Xc=0,Xr=0,Yc=0,Yr=0,Zc=0,Zr = 0;
Xc = Xb / X;
Xr = Xb % X;
Yc = Yb / Y;
Yr = Yb % Y;
if (stack)
{
Zc = Zb / Z;
Zr = Zb % Z;
}
if (stack) {
result= Zc * Xc * Yc;
}
else {
//Seq.Text += "no stack";
result= Xc * Yc;
}
if (result > 0) Seq.Text += result+" flip "+flip+" ";
if (flip == 0)
return result;
else
{
int flip2 = --flip;
if (flip2 == 4 || flip2 == 2 || flip2 == 0)
{ int x = Calculate(X, Z, Y, Xb, Yr, Zb, stack, flip2) + Calculate(X, Z, Y, Xr, Yb, Zb, stack, flip2) + Calculate(X, Z, Y, Xb, Yb, Zr, stack, flip2);
return result + x;
}
else if (flip2 == 3)
{ int x= Calculate(Z, X, Y, Xr, Yb, Zb, stack, flip2) + Calculate(Z, X, Y, Xb, Yr, Zb, stack, flip2) + Calculate(Z, X, Y, Xb, Yb, Zr, stack, flip2);
return result + x;
}
else if (flip2 == 1)
{
int x = Calculate(Y, Z, X, Xb, Yr, Zb, stack, flip2) + Calculate(Y, Z, X, Xb, Yb, Zr, stack, flip2) + Calculate(Y, Z, X, Xr, Yb, Zb, stack, flip2);
return result + x;
}
else return 0;
}
}
}