Java 如何将二维数组拆分为不同大小的纵横字谜?

Java 如何将二维数组拆分为不同大小的纵横字谜?,java,android,arrays,algorithm,Java,Android,Arrays,Algorithm,我正在试验一个纵横填字游戏的生成器,但当它被分成不同的部分时,我就卡住了。我有一个2D数组,我在其中存储纵横字谜,如下所示: int SIZE = 10; //This can be higher for bigger crosswords Character[][] crossword = new Character[SIZE][SIZE]; 然后,我在这个纵横字谜中添加一些单词,例如,以以下数组(.=空方块)结束: 我如何分割这个2D数组,以得到至少包含2个字母但不包含整个单词的片段。字母

我正在试验一个纵横填字游戏的生成器,但当它被分成不同的部分时,我就卡住了。我有一个2D数组,我在其中存储纵横字谜,如下所示:

int SIZE = 10; //This can be higher for bigger crosswords
Character[][] crossword = new Character[SIZE][SIZE];
然后,我在这个纵横字谜中添加一些单词,例如,以以下数组(.=空方块)结束:

我如何分割这个2D数组,以得到至少包含2个字母但不包含整个单词的片段。字母也必须在水平或垂直方向相邻,但不能在对角线方向相邻。例如,我可能会得到以下几件作品:

C    TIG    H    ER    DOV
A           O     S
                  E
以下内容无效,因为字母不是水平或垂直相邻的

  O
GE
  S
我第一次尝试将其拆分为以下内容:

int chunksize = 2; //This should vary depending on how big the pieces should be
List<Character[][]> subArrays = new ArrayList<>();
for(int i = 0; i < SIZE; i += chunksize){
    for(int j = 0; j < SIZE; j += chunksize){
        Character[][] sub = new Character[chunksize][chunksize];
        sub[0][0] = crossword[i][j];
        sub[0][1] = crossword[i][j + 1];
        sub[1][0] = crossword[i + 1][j];
        sub[1][1] = crossword[i + 1][j + 1];
        if(sub[0][0] != null || sub[0][1] != null || sub[1][0] != null || sub[1][1] != null){
            subArrays.add(sub);
        }
    }
}
int chunksize=2//这取决于工件的大小
列表子数组=新的ArrayList();
for(int i=0;i
但是,这可能会创建只包含一个字母的片段或字母不相邻的片段。我不知道该如何解决这个问题,这就是我来这里寻求帮助的原因。

Domino packing 以下方法创建尽可能多的大小为2的块。之后,任何剩余的单个字母都需要以某种方式附加到相邻的块上——例如,随机选择一个相邻的块

创建一个图形,其中字母占据的每个位置都有一个顶点,任何一对垂直或水平相邻字母位置之间都有一条边。现在在这个图上计算a:它选择一个最大大小的边子集,这样就不会有顶点出现在多条边上。这些边对应于大小为2的块


如果你把网格想象成一个棋盘,你会注意到每个正方形都是白色或黑色的,没有边连接两个白色单元格或两个黑色单元格:这意味着图形是二分的,这反过来意味着你可以使用O(| E |*sqrt(| V |))时间,这比Edmonds的普通图算法更快更简单。

我建议您做的是将每一行和每一列转换为自己的字符串

例如: 前3行

..........
..........
..C...H...
前3列

..........
..........
..CAT.....
您可以使用for循环来完成此操作,例如:

for(int x = 0; x < SIZE; x++){
    //Loop through rows and columns.
    //(eg:crossword[x][y] in this loop will extract a row of values)
    //(eg:crossword[y][x] in this loop will extract a column of values)
    for(int y = 0; y < SIZE; y++){
        //Code to build each row/column string
    }
    //Add extracted Strings to an ArrayList?
}
这将为您留下每行和每列的字符串数组

从中提取C和H作为单独的字符串

..........
..........
..C...H...
从中提取CAT作为单个字符串

..........
..........
..CAT.....
这应该允许您根据chunksize检查它们的长度,并返回所需的组合


希望我已经正确理解了这个问题,或者它至少给了您一些想法,可以用来开发您正在寻找的解决方案。

什么是
chunksize
?你能解释一下你想用嵌套的for循环做什么吗?
chunksize
是我想说的部分应该有多大。如果是2,那么我一次检查纵横字谜2个方块,水平和垂直。嵌套for循环用于循环二维数组中的行和列。然而,这种方法(现在的情况)将返回错误格式的片段,我不知道如何更改它(或者可能只是添加更多检查),使其创建具有正确格式的片段。结尾处的null chack检查所创建的块(块)是否包含字母。为什么要拆分数组?我知道你的问题是什么,但不知道你想用这个做什么。我正在尝试创建一个纵横字谜生成器。所以如果我有完整的纵横字谜,我想把它分成更小的部分。然后,将这些片段提供给用户,用户将尝试将所有单词组合在一起。我试图编写一个程序来完成这项工作,而不是手动完成。例如,假设我们只有老虎这个词。然后我想把它分成两部分,像这样:TIG和ER。然后将这些片段交给用户,用户将单击并拖动(如果在android上,则触摸并拖动)以将片段组合在一起并创建单词TIGER。因此
chunksize
对于ER为2,对于TIG为3?我一个字都不懂,但是。。。哇!
..........
..........
..C...H...
..........
..........
..CAT.....