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

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

然后我向这个纵横填字游戏中添加几个单词,例如,最后得到以下数组(。=空正方形):
..........
..........
..C...H...
..A...O...
..TIGER...
......S...
...DOVE...
..........
..........
..........

我该如何分割这个二维数组,以便最终得到至少包含两个字母而不是一个完整单词的片段。字母也必须水平或垂直相邻,但不能对角。例如,我可以得到以下几点:
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);
        }
    }
}

但是,这可能会创建只包含一个字母的片段,或者字母不相邻的片段。我不知道该如何解决这个问题,这就是我来这里寻求帮助的原因。

最佳答案

多米诺牌包装
下面的方法创建尽可能多的size-2块。之后,任何剩余的单个字母都需要以某种方式附加到相邻的块上——例如,随机选取其中一个相邻的块。
创建一个图,其中每个位置的顶点由一个字母占据,并且在任意一对垂直或水平相邻的字母位置之间有一条边。现在计算这个图上的amaximum matching:这选择了一个最大尺寸的边子集,这样就没有顶点在多条边上发生关联。这些边对应于大小为2的块。
如果你把网格想象成一个棋盘,你会注意到每一个正方形要么是白色的要么是黑色的,没有边连接两个白色的单元格或两个黑色的单元格:这意味着图形是二分的,这反过来意味着你可以使用o(e*sqrt(v))-timeHopcroft-Karp algorithm,它比一般图的edmonds算法更快更简单。

关于java - 如何将2D数组拆分为不同尺寸的填字游戏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40483698/

10-10 09:41