为什么我的计算结果错了?

时间:2013-12-13 03:06:55

标签: c#

我正在建立一个程序,用它来计算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;

2 个答案:

答案 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;
{