В матрице из букв найти слово
Задача
Дана квадратная матрица, состоящая из букв. Найти в ней цепочку букв, составляющую заданное слово. Цепочку составляют соседние по горизонтали или вертикали буквы. Вывести на экран номер строки и столбца, в котором начинается слово, а также его расположение (вертикальное или горизонтальное).
Решение
Описание переменных:
str - матрица из символов;
w - заданное слово;
wcol - строка из букв столбцов.
Алгоритм решения задачи:
Чтобы не заполнять матрицу вручную, заполним ее случайными буквами английского алфавита. Далее запросим у пользователя искомое слово.
Функция pos() языка программирования Pascal ищет вхождение подстроки (первый параметр функции) в строку (второй параметр). Если подстрока найдена, то возвращается номер ее первой буквы в строке. Если не найдена, то возвращается 0.
В языке Pascal если матрица состоит из типа данных char, то к строкам матрицы можно обращаться как к строкам, а не массивам. То есть можно извлечь строку матрицы целиком, опуская второй индекс (номер столбца). Таким образом при поиске вхождения заданного слова в строку достаточно перебрать матрицу построчно, каждую строку проверить на вхождение слова (подстроки) с помощью функции pos(). Если pos() возвращает значение больше 0, значит слово входит в строку. Это слово будет начинаться в строке, чей номер определяется итерацией цикла, и в столбце, чей номер определяется значением, которое вернула функция pos().
При поиске слова по столбцам матрицы надо сначала сформировать строку из символов очередного столбца. Внешний цикл в данном случае будет проходить по столбцам, а внутренний - по буквам столбца (по строкам), присоединяя каждую к строке. После того как строка будет сформирована, следует проверить вхождение заданного слова (подстроки) в эту строку. Если слово входит в строку, то его позиция определяется значением, которое вернула pos() (номер строки), и номером итерации внешнего цикла (номер столбца).
Программа на языке Паскаль:
const N = 10; var str: array[1..N,1..N] of char; i,j,k: byte; w, wcol: string[N]; begin randomize; for i:=1 to N do begin for j:=1 to N do begin str[i,j] := chr(random(26) + 97); write(str[i,j],' '); end; writeln; end; write('Введите слово: '); readln(w); // проверяем по строкам for i:=1 to N do begin j := pos(w,str[i]); if j > 0 then writeln('Слово начинается в строке ', i, ' в столбце ', j, ' (горизонтально)'); end; // проверяем по столбцам for j:=1 to N do begin // собираем строку из букв столбца wcol := ''; for i:=1 to N do wcol := wcol + str[i,j]; // проверяем нет ли в ней слова k := pos(w,wcol); if k > 0 then writeln('Слово начинается в строке ', k, ' в столбце ', j, ' (вертикально)'); end; end.
Пример работы программы:
t r j c s m x i c j p c u k r e q k q s k k v i a l t q d l z b m o e e n o b a u d b p w u x w p p y n y x p f f m j d t z h q j f z b a d d r p l x e h i q c o m z g c o e t f a x y d w d e p j p m Введите слово: moe Слово начинается в строке 4 в столбце 3 (горизонтально)
Комментарии
НЕ РАБОТАЕТ
Не работает если в одной строке(столбце) есть содержится несколько таких слов. Примерно написал работает)
вопрос
j := pos(w,str[i]);
в этой строке пишет ошибка
Нельзя преобразовать тип array [1..10] of char к string
j:=pos(w,str[i,j]);
Ответ на вопрос от Гость (не проверено)
j:=pos(w,str[i,j]);