一个矩形面积放入一个大的矩形面积能放多少个不重叠

背景:

  我们先从小范围的来说,把一个矩形面积放到一个大的矩形面积里,我想得到一个比较优良的摆放方式以及知道他摆放的个数

分析考虑:

  通过图形在纸上画出逻辑,假设现在有一个10*15的矩形平面,现在把这个平面放入到一个200*200的矩形平面里面,要求不能重合,形状不能变异,只能是面积和面积之间的拼接,需要考虑到几种摆放方式

解决方案

       起初我是在脑海里分析,然后通过画图方式,把摆放的方式画到纸上,然后通过分析多种摆放方式,找出他们的共性,同时通过代码进行实现和验证,通过多次不同的参数反复的验证和计算,获得算法的正确性,从而得到数量较多的一种逻辑方法,此方法可以理解为合并法,我通过把大的容器面积拆分成两个面积,从而得到两个面积内的数量合并得到最终的数量。为什么会要拆分成两个呢,这里面就考虑了矩形面积可以改变方向摆放,通过画图分析可以得出4种摆放方式。

      

 

   起初是画出8个图,但是通过分析发现其中有4种是重复的,所以画线部分就是一一对应的,所以我最后写出4种图形的编码。

 

代码案例

  

        /// <summary>
        /// 方案综合
        /// </summary>
        /// <param name="mAreaLength"></param>
        /// <param name="mAreaWidth"></param>
        /// <param name="lAreaLength"></param>
        /// <param name="lAreaWidth"></param>
        /// <returns></returns>
        public static long GetPutCountByMethod(long mAreaLength, long mAreaWidth, long lAreaLength, long lAreaWidth)
        {

            var lengthCount = lAreaLength / mAreaLength;
            var widthCount = lAreaWidth / mAreaWidth;
            //求最后宽边剩下的面积是否可以摆放箱子
            long yuCount = 0;
            var leftYu = lAreaWidth - (widthCount * mAreaWidth);
            if (leftYu >= mAreaLength && lAreaLength >= mAreaWidth)
            {
                //表示阴影部分还是可以摆放
                var leftLengthCount = lAreaLength / mAreaWidth;
                var leftWidthCount = leftYu / mAreaLength;
                yuCount += leftLengthCount * leftWidthCount;
            }
            var rigthYu = lAreaLength - (lengthCount * mAreaLength);
            if (rigthYu >= mAreaWidth && lAreaWidth >= mAreaLength)
            {
                //表示阴影部分还是可以摆放
                var rigthLengthCount = rigthYu / mAreaWidth;
                var rigthWidthCount = lAreaWidth / mAreaLength;
                yuCount += rigthLengthCount * rigthWidthCount;
            }
            var count = lengthCount * widthCount + yuCount;
            return count;
        }

        /// <summary>
        /// 方案综合 
        /// </summary>
        /// <param name="areaEntity"></param>
        /// <param name="containerAreaEntity"></param>
        /// <returns></returns>
        public static long GetPutCountByMethod(AreaEntity areaEntity, AreaEntity containerAreaEntity)
        {
            var baseCount1 = GetPutCountByMethod(areaEntity.Length, areaEntity.Width, containerAreaEntity.Length, containerAreaEntity.Width);
            var baseCount2 = GetPutCountByMethod(areaEntity.Width, areaEntity.Length, containerAreaEntity.Length, containerAreaEntity.Width);
            var countList = new List<long>();
            countList.Add(baseCount1);
            countList.Add(baseCount2);
            for (int i = 1; i <= containerAreaEntity.Width / areaEntity.Width; i++)
            {
                if (areaEntity.Width * i <= containerAreaEntity.Width)
                {
                    var beginCount1 = GetPutCountByMethod(areaEntity.Length, areaEntity.Width, containerAreaEntity.Length, areaEntity.Width * i);
                    var endCount1 = GetPutCountByMethod(areaEntity.Width, areaEntity.Length, containerAreaEntity.Length, containerAreaEntity.Width - areaEntity.Width * i);
                    var count1 = beginCount1 + endCount1;
                    countList.Add(count1);
                }
            }

            for (int i = 1; i <= containerAreaEntity.Width / areaEntity.Length; i++)
            {
                if (areaEntity.Length * i <= containerAreaEntity.Width)
                {
                    var beginCount2 = GetPutCountByMethod(areaEntity.Width, areaEntity.Length, containerAreaEntity.Length, areaEntity.Length * i);
                    var endCount2 = GetPutCountByMethod(areaEntity.Length, areaEntity.Width, containerAreaEntity.Length, containerAreaEntity.Width - areaEntity.Length * i);
                    var count2 = beginCount2 + endCount2;
                    countList.Add(count2);
                }
            }

            for (int i = 1; i <= containerAreaEntity.Length / areaEntity.Width; i++)
            {
                if (areaEntity.Width * i <= containerAreaEntity.Length)
                {
                    var beginCount3 = GetPutCountByMethod(areaEntity.Length, areaEntity.Width, areaEntity.Width * i, containerAreaEntity.Width);
                    var endCount3 = GetPutCountByMethod(areaEntity.Width, areaEntity.Length, containerAreaEntity.Length - areaEntity.Width * i, containerAreaEntity.Width);
                    var count3 = beginCount3 + endCount3;
                    countList.Add(count3);
                } 
            }

            for (int i = 1; i <= containerAreaEntity.Length / areaEntity.Length; i++)
            {
                if (areaEntity.Length * i <= containerAreaEntity.Length)
                {
                    var beginCount4 = GetPutCountByMethod(areaEntity.Width, areaEntity.Length, areaEntity.Length * i, containerAreaEntity.Width);
                    var endCount4 = GetPutCountByMethod(areaEntity.Length, areaEntity.Width, containerAreaEntity.Length - areaEntity.Length * i, containerAreaEntity.Width);
                    var count4 = beginCount4 + endCount4;
                    countList.Add(count4);
                }
            }

            countList.Sort();
            return countList[countList.Count() - 1];
        }

 

看到的代码是我需求的一部分,这里就是4种方法的摆放循环,得出每一次计算的结果,最终取数值最大的一个

 

posted on 2022-07-18 09:28  shexunyu  阅读(355)  评论(0编辑  收藏  举报

导航