Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2016, 22:04   #1
caesar_84
Новичок
Джуниор
 
Регистрация: 05.06.2016
Сообщений: 3
Восклицание Перевод координат символа строки в двумерную матрицу

Доброго времени суток, уважаемые дамы и господамы
Есть следующее задание:
"1. Дан двумерный массив, который содержит буквы английского алфавита в нижнем регистре.
2. Метод detectAllWords должен найти все слова из words в массиве crossword.
3. Элемент(startX, startY) должен соответствовать первой букве слова, элемент(endX, endY) - последней.
text - это само слово, располагается между начальным и конечным элементами
4. Все слова есть в массиве.
5. Слова могут быть расположены горизонтально, вертикально и по диагонали как в нормальном, так и в обратном порядке."


Принцип решения, который я использую - выписать поочередно в строку символы по горизонтали, вертикали и диагонали (справа налево и наоборот), методом .contains() найти в каждой строке искомые слова и записать координаты начала и конца, которые, при успешном нахождении слова будут возвращены. Для этого, я создал отдельно методы для поиска по горизонтали, по вертикали и диагонали.
Как уже можно догадаться, с координатами по горизонтали и вертикали проблем нет, а, вот, с чем есть, так это с диагональю.
Вот пример матрицы:
Код:
char[][] crossword = new char[][]{
                {'b', 'd', 'e', 'r', 'l', 'k'},
                {'o', 's', 'a', 'm', 'e', 'o'},
                {'m', 'a', 'g', 'r', 'o', 'v'},
                {'b', 'l', 'l', 'r', 'r', 'h'},
                {'p', 'o', 'e', 'e', 'j', 'j'}
        }
;
Преположим, искомым словом является "ale", расположено оно по диагонали и имеет координаты начала 1, 2 и конца 3, 4. Выписывая строки по диагонали, строка, содержащее это слово, имеет вид "oale", с координатами искомого слова 1 (начало) и 3 (конец).

Внимание, вопрос: как мне перевести координаты из одномерных в двумерные в данном случае?

Далее приведена часть кода для диагонального поиска:
Код:
private static Word searchDiagLToRAlign(char[][] crossword, String wordToSearch)
    {
        Word foundWord = new Word(wordToSearch);
        boolean found = false;

        for (int i = 0; i < crossword.length; i++)
        {
            char[] wordToSearchIn = new char[crossword.length - i];
            for (int j = 0; j < wordToSearchIn.length; j++)
            {
                wordToSearchIn[j] = crossword[j + i][j];
                System.out.print(wordToSearchIn[j]);
            }
            System.out.println();
            String stringToSearchIn = new String(wordToSearchIn);
            if (stringToSearchIn.contains(wordToSearch))
            {
                found = true;
                foundWord.setStartPoint(i, stringToSearchIn.indexOf(wordToSearch));
              //  foundWord.setEndPoint();
            }
        }

        return found ? foundWord : null;
    }
PS. Поиск в обратном порядке, а также, поиск вверх от основной диагонали пока не реализован.

PPS. Код класса Word:
Код:
public static class Word {
        private String text;
        private int startX;
        private int startY;
        private int endX;
        private int endY;

        public Word(String text) {
            this.text = text;
        }

        public void setStartPoint(int i, int j) {
            startX = i;
            startY = j;
        }

        public void setEndPoint(int i, int j) {
            endX = i;
            endY = j;
        }

        @Override
        public String toString() {
            return String.format("%s - (%d, %d) - (%d, %d)", text, startX, startY, endX, endY);
        }
    }
caesar_84 вне форума Ответить с цитированием
Старый 05.06.2016, 22:50   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Если верно разобрался, то примерно так:
Код:
int p = stringToSearchIn.indexOf(wordToSearch);
int k = wordToSearch.length;
foundWord.setStartPoint(i + p, p);
foundWord.setEndPoint(i + p + k, p + k);
Вот только такой подход не слишком ли сложен? Мне это представляется примерно так: просматривается crossword, пока не найдется первая буква слова, затем проверяются все доступные на текущий момент направления (все восемь, если не находимся у границы массива) для нахождения второй буквы слова, направление фиксируется, и по нему происходит проверка наличия остатка слова, если нашлось слово, то возвращаем результат, если не нашлось, то возвращаемся к поиску первой буквы слова.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.06.2016, 23:07   #3
caesar_84
Новичок
Джуниор
 
Регистрация: 05.06.2016
Сообщений: 3
По умолчанию

Спасибо большое)
Не совсем)) Матрица crossword делится на столбцы, ряды и диагонали, они, один за одним, проверяются на наличие искомого слова, если слово не найдено, столбцы, ряды и диагонали инвертируются и снова просматриваются. При нахождении слова, выписываются его начальные и конечные координаты в строке, которые переводятся в координаты на двумерной матрице.
Вот как, например, выглядит поиск по горизонтали:
Код:
private static Word searchHorizontals (char[][] crossword, String wordToSearch)
 {
        Word foundWord = new Word(wordToSearch);
        boolean found = false;

        for (int i = 0; i < crossword.length; i++)
        {
            String stringToSearch = new String(crossword[i]);
            if (stringToSearch.contains(wordToSearch))
            {
                found = true;
                foundWord.setStartPoint(stringToSearch.indexOf(wordToSearch), i);
                foundWord.setEndPoint(stringToSearch.indexOf(wordToSearch) + wordToSearch.length() - 1, i);
                break;
            }
        }

        return found ? foundWord : null;
    }
А вот так, метод detectAllWords:
Код:
public static List<Word> detectAllWords(int[][] crossword, String... words)
    {
        List<Word> list = new ArrayList<Word>();
        char[][] charCross = new char[crossword.length][crossword[0].length];

        for (int i = 0; i < charCross.length; i++)
        {
            for (int j = 0; j < charCross[i].length; j++)
            {
                charCross[i][j] = (char) crossword[i][j];
            }
        }

        for (int i = 0; i < words.length; i++)
        {
            Word search = searchHorizontals(charCross, words[i]);
            if (search != null)
            {
                list.add(search);
                continue;
            }

            search = searchVerticals(charCross, words[i]);
            if (search != null) {
                list.add(search);
                continue;
            }

            search = searchDiagLToRAlign(charCross, words[1]);
            if (search != null) {
                list.add(search);
                continue;
            }
        }
        
        return list;
    }
А какие еще могут быть варианты решения? С удовольствием бы их тоже изучил)))

Последний раз редактировалось BDA; 05.06.2016 в 23:26.
caesar_84 вне форума Ответить с цитированием
Старый 05.06.2016, 23:12   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

caesar_84, нет-нет, я имел ввиду то, как вижу более простое решение.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.06.2016, 23:14   #5
caesar_84
Новичок
Джуниор
 
Регистрация: 05.06.2016
Сообщений: 3
По умолчанию

Ааа, понял. Тоже можно, наверное, надо попробовать))
caesar_84 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод координат tytona Помощь студентам 0 29.12.2014 20:08
Перевод GPS-координат на плоскость MooNDeaR Свободное общение 12 10.09.2014 15:36
перевод координат neprogrammist Общие вопросы Delphi 2 18.05.2010 23:20
Перевод координат ax1d Общие вопросы Delphi 1 04.11.2009 14:23
Перевод строки в матрицу Chepa Общие вопросы Delphi 14 28.01.2007 00:13