我正在建立一个程序,用它来计算C#中任何尺寸的盒子中有多少块砖。而且砖也适合任何方向。它适用于我的一些测试,其中返回的答案是我期望的,但是其他人,答案(虽然技术上正确)并没有返回你可以放入盒子的最大数量。
private static int BricksPerDimension(int dimWidth, int dimLength, int dimHeight, int brickSideWidth, int brickSideLength, int brickSideHeight)
{
int newBrickSideHeight;
int newBrickSideWidth;
if (dimHeight >= brickSideLength)
{
newBrickSideHeight = brickSideLength;
return (int)Math.Floor((double)dimHeight / newBrickSideHeight);
}
else if (dimWidth >= brickSideLength)
{
newBrickSideWidth = brickSideLength;
return (int)Math.Floor((double)dimWidth / newBrickSideWidth);
}
else if (dimLength >= brickSideLength)
{
return (int)Math.Floor((double)dimLength / brickSideLength);
}
else if (dimLength <= brickSideLength && dimHeight <= brickSideLength && dimWidth <= brickSideLength)
{
return 0;
}
else
{
return 0;
}
这是我的代码测试结果如下: 尺寸为10x20x50的盒子,砖块为1x2x5 = 1000块砖,这是我的预期。当我测试了盒子但是重新排序的尺寸例如20x10x50我再次返回1000块砖块时很棒。
但是例如这个测试盒= 20 x 70 x 30 brick = 1 x 2 x 5返回2744,除非我自己的计算严重错误,否则应该返回4200块。
我已经使用断点来查看变量的任何值是否在某处出错,但似乎没有任何错误。 我已经在这个问题上摸不着头几天了,并没有更接近于搞清楚。
提前致谢。 P.S 我构建关于任何方向的砖的代码的方式是,如果砖的最长边等于或小于盒子的最长边,那么至少1块砖必须能够适合。所以我做了if语句来检查这是否属实,然后更改变量。如果这是错误的方法,请告诉我。
编辑乘法:
int numX = BricksPerDimension(boxW, boxL, boxH, brickSideWidth, brickSideLength, brickSideHeight);
int numY = BricksPerDimension(boxW, boxL, boxH, brickSideWidth, brickSideLength, brickSideHeight);
int numZ = BricksPerDimension(boxW, boxL, boxH, brickSideWidth, brickSideLength, brickSideHeight);
return numX * numY * numZ;
答案 0 :(得分:1)
就像挑选3号彩票一样,3个维度可以代表任何位置,例如将砖块平放在其高端或侧面。那就是说,我们有6种基于ex的组合:123,132,213,231,312,321,其中每个数字都在相应的位置。 如果你有一些奇怪的尺寸,例如25x33x40和11x10x5的砖尺寸(是的,右),11对应于25,10到33,5到40不一定有意义,但是如果你有DID计算基于此,你将得到每25个2块,每33个3块,每40块或2x3x8 = 48块砖8块。
现在,如果尝试11在第二个位置,10在最后位置,5在第一个位置,你得到5:25,11:33和10:40或5块砖3块砖4块砖5x3x4 = 60块砖,因为我们无法将砖切成碎片而你正在使用FLOOR来处理这个问题。所以,我会尝试所有6种组合,只是采取最高的。
关于我如何测试的注意事项。我总是将箱子的尺寸分别留给长度,宽度和高度。然后,在循环中,我所做的就是改变TEST变量&#34; l&#34; ength,&#34; w&#34; idth,&#34; h&#34; 8相应的6种组合,如pick-3抽奖。通过测试每个的整数将基于在堆叠框中放置的方式给出其自己的值...无论哪种方式获胜最多。
因此,对于传递0/1,LENGTH var保持不变,并且h / w交换。在传球2/3中,WIDTH位于第一位置并且交换l / h,最后在传球4/5中,HEIGHT处于第一位置并交换l / w。所以所有6种组合都占了。
示例调用
totalBricks = BricksPerDimension(20, 70, 30, 1, 2, 5);
MessageBox.Show(totalBricks.ToString());
totalBricks = BricksPerDimension(25, 33, 40, 11, 10, 5);
MessageBox.Show(totalBricks.ToString());
更新的功能
private static int BricksPerDimension(int dimWidth, int dimLength, int dimHeight, int brickSideWidth, int brickSideLength, int brickSideHeight)
{
int maxBricks = 0;
int curBricks = 0;
int l, w, h;
l = w = h = 0;
for (int i = 0; i < 6; i++)
{
switch (i)
{
case 0:
l = brickSideLength;
h = brickSideHeight;
w = brickSideWidth;
break;
case 1:
l = brickSideLength;
w = brickSideHeight;
h = brickSideWidth;
break;
case 2:
w = brickSideLength;
l = brickSideHeight;
h = brickSideWidth;
break;
case 3:
w = brickSideLength;
h = brickSideHeight;
l = brickSideWidth;
break;
case 4:
h = brickSideLength;
l = brickSideHeight;
w = brickSideWidth;
break;
case 5:
h = brickSideLength;
w = brickSideHeight;
l = brickSideWidth;
break;
}
curBricks = ((int)dimLength / l)
* ((int)dimWidth / w)
* ((int)dimHeight / h);
if (curBricks > maxBricks)
maxBricks = curBricks;
}
return maxBricks;
}
答案 1 :(得分:0)
private static int BricksPerDimension(int dimWidth, int dimLength, int dimHeight, int brickSideWidth, int brickSideLength, int brickSideHeight)
{
int dimMax, dimMid, dimMin;
int brickSideMax, brickSideMid, brickSideMin;
//TODO: dimWidth, dimLength, dimHeight => dimMax, dimMid, dimMin
//so does brickSideMax, brickSideMid, brickSideMin.
if (dimMax < brickSideMax)
return 0;
if (dimMid < brickSideMid)
return 0;
if (dimMin < brickSideMin)
return 0;
int maxDirection = (int)Math.Floor((double)dimMax / brickSideMax);
int midDirection = (int)Math.Floor((double)dimMid / brickSideMid);
int minDirection = (int)Math.Floor((double)dimMin / brickSideMin);
return maxDirection * midDirection * minDirection;
{