При создании кроссворда человек обычно ищет слово определенной длины с определенной буквой в определенной позиции. Итак, вам, вероятно, понадобится такая функция:
List<String> findWord(int ofLength, char withLetter, int atIndex) {/*implementation*/}
Который, вероятно, мог бы использовать набор предварительно созданных HashMaps для быстрого создания набора кандидатов. (Возможно, вы также захотите отследить, используется ли слово уже в кроссворде ... при условии, что дубликаты не допускаются)
Еще одна вещь, которую люди делают, это угадывают, используя подсказки. Я полагаю, что вы, вероятно, не ищете сильный ИИ, так что остаются алгоритмы грубой силы ... в этом случае попробуйте заполнить кроссворд, начиная с самых больших слов, так как там обычно меньше возможностей.
Скелетный алгоритм:
private void checkPuzzleOn(Row row, SolutionSet s) {
List<Row> crossingRows = row.getCrossingRows();
if(allAlreadyFilled(crossingRows)) {
//This part of the crossword works; store info in solution set.
return;
}
crossingRows.sortBiggestToSmallest();
foreach(Row crossing in crossingRows) {
int index = row.getIndexOfIntersectionWith(crossing);
char c = row.charAt(index);
List<String> candidates = findWords(crossing.length, c, index);
foreach(String candidate in candidates) {
verifyAgainstPresentWords(crossing, candidate); //check that using this word won't collide with others; important because of cycles.
}
if(candidates.isEmpty()) {
//This part of the crossword won't match! store info in solution set.
return;
}
foreach(String candidate in candidates) {
crossing.setWord(candidate);
checkPuzzleOn(crossing, s);
}
}
}