块堆叠算法

时间:2020-06-14 08:29:44

标签: algorithm

我很确定这个简单的问题的名字正确,但是我不知道它是什么。

我有许多不同宽度的块(都是相同的高度)。

我想水平堆叠这些块,以使行的宽度不超过预定义的“最大宽度”常量。如果在任何时候放置新块使行的宽度超过最大宽度,则将其删除并放在新行上。

是否有一种算法可以优化块的堆叠,以使行数最少?

此问题的名称是什么,如何解决?

1 个答案:

答案 0 :(得分:1)

这是Java中的一种算法,可以实现所需的功能,尽管您可能必须进行大量调整和编辑。

 public static void main(String[] args) {
    int maxWidth=100;
    int i;
    ArrayList<ArrayList<Integer>> serialBlocksData = new ArrayList<>(100);
    int temporarySumOfWidth;
    temporarySumOfWidth=0;
    int currentHorizontalLogOfBlock=0;
    for(i=0; i < 100; i++) {
        serialBlocksData.add(new ArrayList());
    }
    for(i=0;(temporarySumOfWidth<maxWidth&&currentHorizontalLogOfBlock<100);i++){
        if((temporarySumOfWidth+i)>=maxWidth){
            currentHorizontalLogOfBlock=currentHorizontalLogOfBlock+1;
            temporarySumOfWidth=0;
            serialBlocksData.get(currentHorizontalLogOfBlock).add(i);
            temporarySumOfWidth=temporarySumOfWidth+i;
        }else{
            serialBlocksData.get(currentHorizontalLogOfBlock).add(i);
            temporarySumOfWidth=temporarySumOfWidth+i;
        }
    }
    System.out.println(serialBlocksData);
}

这是上面代码的输出。

[[0,1,2,3,4,5,6,7,8,9,10,11,12,13],[14,15,16,17,17,18,19],[20 ,21、22、23],[24、25、26],[27、28、29],[30、31、32] ,[33、34],[35、36],[37、38],[39、40],[41、42],[43、44],[45、46],[47、48],[ 49、50],[51],[52],[53],[54],[55],[56],[57], [58],[59],[60],[61],[62],[63],[64],[65],[66],[67],[68],[69],[70] ],[71],[72],[73],[74],[75],[76],[77],[78],[79], [80],[81],[82],[83],[84],[85],[86],[87],[88],[89],[90],[91],[92] ],[93],[94],[95],[96],[97],[98],[99],[100],[],[] ,[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[ ],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]

关于如何使这种算法起作用的一些注释

  1. 最大宽度为100
  2. 块堆栈存储在二维Arraylist中。最低的块堆栈是Array [0] [],然后是Array [1] [] ......,依此类推。
  3. 具有给定权重的块是由for循环产生的,该循环将i的值加1(从i = 0开始),并且仅在临时SumOfWidth小于100和currentHorizo​​ntalLogOfBlock小于100(二维数组,第一个维为100)
  4. 将块堆叠到位,直到'i'大于100,这意味着如果限制为100,则不能堆叠宽度大于100的块。

这不是完美的,所以请写下您可能有的任何疑问。

相关问题