算法: 大长方形最多可以放多少个个小的长方形,大小长方形长宽都只有一种

发布时间 2023-12-31 00:18:00作者: 那时一个人

https://www.engineeringtoolbox.com/smaller-rectangles-within-larger-rectangle-d_2111.html


  function calculateRectangle() {
    var rw = parseFloat($j('#rw').val());
    var rh = parseFloat($j('#rh').val());
    var sw = parseFloat($j('#sw').val());
    var sh = parseFloat($j('#sh').val());
    var cs = parseFloat($j('#cs').val());
    if (rw > 0 && rh > 0 && sh > 0 && sw > 0) {
      var canvas = document.getElementById('myCanvas');
      var context = canvas.getContext('2d');
      context.clearRect(0, 0, canvas.width, canvas.height);
      var scale = canvas.width / rw;
      if (canvas.height / rh < scale) scale = canvas.height / rh;
      var rectangleOuter = new Rectangle(0, 0, rw, rh);
      drawRectangle(rectangleOuter, 'yellow', 2, 'black');
      var maxPosX = 0;
      var maxDone = false;
      var maxPosY = 0;
      var recArray = [
      ];
      if ((sw + cs) < rw && (sh + cs) < rh) {
        var posX = 0 + cs;
        var posY = 0 + cs;
        do {
          if (posY + 2 * sh + cs > rh) {
            if (posY + sw <= rh) {
              var swt = sw;
              sw = sh;
              sh = swt;
            }
          }
          do {
            var rec = new Rectangle(posX, posY, sw, sh);
            recArray.push(rec);
            posX = Math.round((posX + sw + cs) * 1000) / 1000;
            maxPosY = posY;
          } while (posX + sw + cs <= rw);
          if (!maxDone) {
            maxPosX = posX;
            maxDone = true;
          }
          posX = 0 + cs;
          posY = Math.round((posY + sh + cs) * 1000) / 1000;
        } while (posY + sh <= rh);
        if (maxPosX + sw <= rw) {
          posY = 0 + cs;
          posX = maxPosX;
          if (sw > sh) {
            var sht = sw;
            sw = sh;
            sh = sht;
          }
          do {
            var rec = new Rectangle(posX, posY, sw, sh);
            recArray.push(rec);
            posY = Math.round((posY + sh + cs) * 1000) / 1000;
          } while (posY + sw <= maxPosY);
        }        //$j("#results").html("Maximum number of smaller rectangles inside larger rectangle: <b><u>" + recArray.length + "</u></b>");

        var msg = '<p style="padding-left: 30px;">Maximum number of smaller rectangles inside larger rectangle: <span class="result"><u>' + recArray.length + '</u></span></p>';
        var areaLargeRectangle = rw * rh;
        var areaSmallRectangle = sw * sh;
        var areaAllRectangles = areaSmallRectangle * recArray.length;
        msg += '<p style="padding-left: 30px;">Area Rectangle (in<sup>2</sup>, mm<sup>2</sup>, m<sup>2</sup>): <span class="result">' + Conv.rounding(areaLargeRectangle) + '</span></p>';
        msg += '<p style="padding-left: 30px;">Area Small Rectangle (in<sup>2</sup>, mm<sup>2</sup>, m<sup>2</sup>): <span class="result">' + Conv.rounding(areaSmallRectangle) + '</span></p>';
        msg += '<p style="padding-left: 30px;">Area all Rectangles (in<sup>2</sup>, mm<sup>2</sup>, m<sup>2</sup>): <span class="result">' + Conv.rounding(areaAllRectangles) + '</span></p>';
        msg += '<p style="padding-left: 30px;">Small Rectangles to Large Rectangle Area Ratio (%): <span class="result">' + Conv.rounding(100 * areaAllRectangles / areaLargeRectangle) + '</span></p>';
        $j('#results').html(msg);
      }
      for (var i = 0; i < recArray.length; i++) {
        drawRectangle(recArray[i], 'white', 1, ' #21618c ')
      }
    } else {
      alert('Check values! Dimensions can not be 0.');
    }

人家用js 实现了,后边用python 实现下