Я пытаюсь запрограммировать Java-приложение Ruzzle Solver для целей обучения. У меня есть небольшая проблема с «нахождением слов» на карте типа Ruzzle.
Пример карты Ruzzle (она состоит из 4 строк и 4 столбцов по 1 букве в каждой ячейке):
Z O O H
E Y L H
I E L I
H O F M
http://www.maclife.com/files/imagecache/futureus_imagegallery_fullsize/gallery/ruzzle1.jpg
Я хотел бы получить список всех возможных слов, которые вы можете найти на такой карте.
Сложность: вы можете найти слово, добавляя буквы по вертикали, горизонтали и диагонали (пример: «ПРИВЕТ»).
На данный момент я создал 3 класса:
Ruzzlesolver.java
Письмо.java
Map.java
Класс письма
Описывает одну букву карты, ее поля — это позиции X и Y, а также символ ячейки.
Класс Ruzzlesolver
Это основной класс.
- он читает карту Ruzzle (построчный ввод в консоли)
- он читает файл dictionnary.txt
- он сравнивает карту с файлом словаря
- он записывает в файл results.txt
Каждая строка хранится в массиве символов. Затем я создаю новый объект Map из 4 полученных массивов.
Класс карты
Это конструктор объектов Map:
public Map(final char[] pTab1, final char[] pTab2, final char[] pTab3, final char[] pTab4)
{
this.aLettres = new ArrayList<Letter>();
for (int i = 0 ; i < 4 ; i++) {
this.aLettres.add(new Letter(1, i+1, pTab1[i]));}
for (int i = 0 ; i < 4 ; i++) {
this.aLettres.add(new Letter(2, i+1, pTab2[i]));}
for (int i = 0 ; i < 4 ; i++) {
this.aLettres.add(new Letter(3, i+1, pTab3[i]));}
for (int i = 0 ; i < 4 ; i++) {
this.aLettres.add(new Letter(4, i+1, pTab4[i]));}
}
this.aLettres — это список ArrayList, содержащий каждую из 16 букв карты.
Каждая буква знает свой столбец (позиция X: "i+1"), свою строку (позиция Y: "1, 2, 3 и 4") и свой символ ("pTab[i]").
Теперь, когда мы знаем карту и место каждой буквы, мы можем начать находить слова.
Метод содержит()
Это моя проблема: я застрял, используя следующий метод:
Как это называется
- Я выбираю слово из словаря в классе Ruzzlesolver.
Я вызываю метод contains() для моего объекта Map с этим словом в качестве параметра:
if (this.aMap.contains(vMot)) {/*print vMot in the result.txt file*/}
Как работает метод contains()
Переменные:
char[] vChars = new char[pMot.length()]; ArrayList<Letter> vFoundCharS1 = new ArrayList<Letter>();
Хранение каждого символа pMot в ArrayList:
for (int i = 0 ; i < pMot.length() ; i++) { vChars[i] = pMot.charAt(i); }
Поиск первого символа pMot:
for (Letter vL : this.aLettres) { if (vL.getChar() == vChars[0]) { vFoundCharS1.add(vL); return true; } }
- Я застрял.
Если я продолжу этот метод, мне придется создавать все более и более длинные блоки по мере продвижения. Кроме того, мне нужно было бы написать 16 блоков, чтобы учесть все возможные длины.
Я уверен, что это неправильный метод. Как бы вы реализовали такое лечение?
Заранее большое спасибо за вашу помощь.
PS: Прошу прощения за грамматические/английские ошибки, английский не мой родной язык.