如何在javascript中给定块数组的情况下在可用空间中添加块?

如何在javascript中给定块数组的情况下在可用空间中添加块?,javascript,algorithm,Javascript,Algorithm,我有一个网格,它可以从“myblocks”表示的某个初始状态开始。我想通过单击按钮“#addBlockButton”在空白区域添加新的正方形或矩形,前提是: 1) 网格中有可用空间。 2) 可用空间满足要求 由“最小宽度”和“最小高度”定义的最小块大小 添加的块将添加到可用空间中,如果没有可用空间,则发出“无可用空间”警报 blockCounter只是一个自动递增的唯一标识符 假设网格尺寸为10x10,最小块尺寸为: let grid_width = 10 let grid_height = 1

我有一个网格,它可以从“myblocks”表示的某个初始状态开始。我想通过单击按钮“#addBlockButton”在空白区域添加新的正方形或矩形,前提是:

1) 网格中有可用空间。 2) 可用空间满足要求 由“最小宽度”和“最小高度”定义的最小块大小

添加的块将添加到可用空间中,如果没有可用空间,则发出“无可用空间”警报

blockCounter只是一个自动递增的唯一标识符

假设网格尺寸为10x10,最小块尺寸为:

let grid_width = 10
let grid_height = 10
let block_min_width = 2
let block_min_height = 2
我有一个块数组“myblocks”,如下所示:

例如: 这是占用整个网格的单个块

myblocks = [{
'blockCounter':1,
'x': 0,
'y': 0,
'height': 10
'width': 10
}]
下面是一个包含3个块的示例

myblocks = [{
'blockCounter':1,
'x': 0,
'y': 0,
'height': 3
'width': 3
},
{'blockCounter':2,
'x': 3,
'y': 3,
'height': 3
'width': 7
}
{'blockCounter':3,
'x': 0,
'y': 4,
'height': 3
'width': 5
}
]

有效地执行此操作的最佳方法是什么?

尝试以下方法: 我没有测试边缘案例,但它应该可以正常工作(它对我有效:)…) 其O(n)算法:

var cubes = [];
var rowSpace = (function () {
    let rowSpace = [];
    for (var i = 0; i < grid_width; i++) {
        rowSpace[i] = grid_width;
    }
    return rowSpace;
})();

function addBlock(block) {
    var minY = 0, maxY = 0, i;

    if (_isBlockValid(block)) {
        for (i = 0; i < rowSpace.length; i++) {
            if (rowSpace[i] >= block.width) {
                maxY++;
                if ((maxY - minY) >= block.height) {
                    _add(grid_width - rowSpace[i], minY, block);
                    _updateRows(minY, block.height, block.width);
                    return;
                }
            } else {
                minY++;
                maxY++;
            }
        }
    }

    //If you have got here, its because of an error
    console.log("no space available for: " + JSON.stringify(block));
}

function _isBlockValid(block) {
    return block && (typeof block.height === "number" && block.height >= block_min_height) &&
        (typeof block.height === "number" && block.width >= block_min_width);
}

function _add(x, y, block) {
    cubes.push({x, y, block});
}

function _updateRows(minY, rows, diff) {
    for (var i = minY; i < rows; i++) {
        rowSpace[i] -= diff;
    }
}

//Execution
for (var i = 0; i < myblocks.length; i++) {
    addBlock(myblocks[i]);
}
var cubes=[];
var rowSpace=(函数(){
让rowSpace=[];
对于(变量i=0;i=块宽度){
maxY++;
如果((最大-最小)>=块高度){
_添加(网格宽度-行空间[i],最小,块);
_updateRows(minY、block.height、block.width);
返回;
}
}否则{
minY++;
maxY++;
}
}
}
//如果你到了这里,那是因为一个错误
log(“没有空间用于:”+JSON.stringify(block));
}
函数_isBlockValid(块){
返回block&(typeof block.height==“number”&&block.height>=block\u min\u height)&&
(typeof block.height==“number”和&block.width>=block\u min\u width);
}
函数_添加(x、y、块){
push({x,y,block});
}
函数_updateRows(minY、rows、diff){
for(var i=minY;i