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

标签 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

如您所见:目标是从左上角的方 block 开始,并在必要时扩展该方 block ,同时不放置可能位于串联数组中的任何 null 或空项。

我的代码在前 4 个方面运行良好,但我真的想不出我应该如何以通用方式扩展它。如何为此类任务编写通用算法?


编辑澄清: 使用放置元素的数量放置模式应该是这样的:

 1 2 5 10
 3 4 6 11
 7 8 9

最佳答案

这是我根据对您的问题的理解编写的一些 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)

关于java - 将单元格放置在网格(表)中的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24008484/

相关文章:

java - 找不到 Itext7 jar

java对功能模块的访问控制

JAVA更新ArrayList对象方法不更新

javascript - 找到排序数组值之间的最大差异

algorithm - 如何在 O(nloglogn) 时间复杂度内对 range[1, logn**logn] 中的 n 个元素进行排序?

c - C 中的归并排序

java - 解决依赖的重复版本

java - xml使用sax解析器从子标签解析数据

algorithm - 类似缓存的机制(哪种数据结构)?

Python:为相对支持先验算法生成候选项集