如何为填字游戏分割不同大小的2D数组?

时间:2016-11-08 09:49:54

标签: java android arrays algorithm

我正在尝试使用生成器进行填字游戏,但是当我将它拆分成不同的部分时,我会陷入困境。我有一个2D数组,我在这里存储填字游戏:

int SIZE = 10; //This can be higher for bigger crosswords
Character[][] crossword = new Character[SIZE][SIZE];

然后我在这个填字游戏中添加了几个单词,例如最终得到以下数组(。=空方块):

..........
..........
..C...H...
..A...O...
..TIGER...
......S...
...DOVE...
..........
..........
..........

如何拆分这个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);
        }
    }
}

但是,这可能会创建仅包含一个字母或多个字母的部分,其中字母不是彼此相邻的。我不知道如何解决这个问题,这就是我来这里寻求帮助的原因。

2 个答案:

答案 0 :(得分:0)

Domino打包

以下方法可以创建尽可能多的size-2块。之后,任何剩余的单个字母都需要以某种方式附加到相邻块 - 例如,通过随机选择一个相邻块。

创建一个图形,其中包含字母占据的每个位置的顶点,以及任意一对垂直或水平相邻字母位置之间的边。现在在此图上计算maximum matching:这会选择一个最大尺寸的边缘子集,这样就不会有多个顶点出现在多个边上。这些边对应于2号块。

如果您将网格想象为棋盘,您会注意到每个方格都是白色或黑色,没有边连接两个白色单元格或两个黑色单元格:这意味着图形是二分的,而这又是意味着您可以使用O(| E | * sqrt(| V |)) - 时间Hopcroft-Karp algorithm,这比一般图形的Edmonds算法更快更简单。

答案 1 :(得分:0)

我建议您将每行和每列转换为它自己的字符串。

例如: 前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?
}

拥有这些字符串之后你可以使用以下方法拆分它们:(假设。仍然是你的分隔符)

s.split("\\.");

这将为您留下每行和每列

的字符串数组

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

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

这应该允许你根据chunksize检查它们的长度并返回你想要的组合。

希望我已正确理解问题,或者它至少为您提供了一些可用于开发您正在寻找的解决方案的想法。