将单元格放置在网格中的算法(表格)

时间:2014-06-03 06:31:49

标签: java algorithm

我的计划是将每个元素放在GridPane中的JavaFX程序上。但是javafx实际上并不是我的问题,因为我无法在抽象中进一步创建具有以下特征的算法:

这是算法本身的一个示例,因此您不必查看不必要的javaFX元素。

public static void main(String[] args) {
    String[] v1 = {null,"1",null,"3"};
    String[] v2 = {"0","\"1",null,"3"};
    String[] v3= {"4","5","6","","8","9","","11","12","13"};

    int row=0, col=0, index=0;
    String[] v = concat(v1, v3);
    for(String s: v){
        if(s != null && !s.isEmpty()){
            if(index<3){
               if(col<2){
                   col++;
                   index++;
               }
               else{
                   col=0;
                   row++;
                   System.out.println("");
               }
                //System.out.println("index="+index);
               System.out.print("  "+s);
            }
        }
    }

v1,v3的所需输出为:

    1  3  6  
    4  5  8 
    11 12 13

v2,v3的所需输出为:

    0  1  5  12
    3  4  6  13
    8  9  11

正如您所看到的那样:目标是从左上角开始,并在必要时扩展该方块,同时不放置可能在连接数组中的任何null or empty项。

我的代码适用于前4个,但我无法真正考虑如何以通用方式扩展它。如何为这样的任务编写通用算法?


编辑以澄清: 使用放置元素的编号,放置模式应如下所示:

 1 2 5 10
 3 4 6 11
 7 8 9

1 个答案:

答案 0 :(得分:2)

这是我从我对你的问题的理解中写的一些Python代码。希望你能翻译它。

主要思想如下:如果你完成了一个正方形,那么从上到下填充最右边的部分,然后从左到右填充底部。

from pprint import pprint

t = range(1,92)
n = len(t)

s = int(n**.5+1)

mat = [[None]*s for _ in range(s)]

i, j = 0, 0
k = 0
st = "right"

while k<n:
    mat[i][j] = t[k]
    k += 1
    if i==j and st=="right":
        i = 0
        j += 1
        st = "down"
    elif st == "right":
        j += 1
    elif i+1==j and st=="down":
        i += 1
        j = 0
        st = "right"
    else:
        i += 1

pprint(mat)