![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перебор всех значений в stringgrid
kodius © (2009-10-18 18:36:00)Здравствуйте, уважаемые мастера! Занялся решить следующую задачу.
Допустим, на форме есть stringgrid 5 на 5. В каждой ячейке - буква. Нужно составить из этих букв все возможные слова, причём буквы должны выбираться по правилу "соседства" - используются ячейки, находящиеся только рядом (как в игре "балда"). Подскажите, как это реализовать.
Германн (2009-10-21 01:08:00) [1]
> Благодарю! Буду разбираться в коде.
Только не на форуме! :)
kodius (2009-10-20 23:49:00) [2]Благодарю! Буду разбираться в коде.
Омлет (2009-10-20 23:39:00) [3]А яндекс кому?
http://www.delphisources.ru/pages/sources/raznoe/2007_year/balda-game.html
kodius (2009-10-20 23:24:00) [4])) Можно и код)
Омлет (2009-10-20 23:15:00) [5]Код игры "балда"? ))
kodius (2009-10-20 22:49:00) [6]А код есть какой-нить для примера? Чёт ничего в голову не идёт((
И. Павел (2009-10-19 11:49:00) [7]А я делал эту задачку так: сначала выбирал первое слово. Во все клетки, где есть первая буква этого слова ставил '1', во все клетки, смежные с клетками '1', где есть вторая буква этого слова - ставил '2', и так, пока некуда будет поставить букву или когда установится последняя буква (тогда шел назад, 'раскручивая найденное слово'). Алгоритм быстрый но не учитывает 'завихрения', слова, и то, что буквы в слове могут повторяться.
RWolf (2009-10-19 09:49:00) [8]
процедура рекурсивный_обход_комбинаций(начало_слова):
напечатать все слова из словаря, совпадающие с началом_слова
для каждого из соседей последнего символа начала_слова:
если сосед наступает слову на хвост:
вернуться из рекурсивного_обхода_комбинаций
добавить соседа к началу_слова
если ни одно слово в словаре не начинается с нового_начала_слова:
вернуться из рекурсивного_обхода_комбинаций
рекурсивный_обход_комбинаций(новое_начало_слова)
конец процедуры
повторить процедуру для каждой ячейки таблицы.
как-то так.
kodius (2009-10-18 20:17:00) [9]Омлет, спасибо за идею! Буду пробовать.
kodius (2009-10-18 20:15:00) [10]
s:=stringgrid1.Cells[row,col];
if (col>0) and (row>0) then
s:=s+stringgrid1.Cells[row-1,col-1];
addtolist(s);
if row>0 then
s:=s+stringgrid1.Cells[row-1,col];
addtolist(s);
if (col< (stringgrid1.ColCount-1)) and (row>0) then
s:=s+stringgrid1.Cells[row-1,col+1];
addtolist(s);
if col< (stringgrid1.ColCount-1) then
s:=s+stringgrid1.Cells[row,col+1];
addtolist(s);
if (col<(stringgrid1.ColCount-1)) and (row<(stringgrid1.RowCount-1))
then
s:=s+stringgrid1.Cells[row+1,col+1];
addtolist(s);
if row<(stringgrid1.rowcount-1) then
s:=s+stringgrid1.Cells[row+1,col];
addtolist(s);
if (col> 0) and (row<(stringgrid1.RowCount-1)) then
s:=s+stringgrid1.Cells[row+1,col-1];
addtolist(s);
if col>0 then
s:=s+stringgrid1.Cells[row,col-1];
addtolist(s);
addtolist - это функция, которая добавляет в список слов получившееся слово.
Приведенная выше функция осуществляет перебор всех возможных вариантов только вокруг одной ячейки. А как дальше-то быть?
Омлет (2009-10-18 20:14:00) [11]Берешь букву, берешь первую соседнюю, если в словаре есть слова начинающиеся на этот слог, смотришь дальше соседей второй буквы, кроме изначальной, опять словарь и так далее. Рекурсивный перебор очевидно нужен.
kodius (2009-10-18 20:12:00) [12]"Конференция для начинающих, а также для тех, кому сложно объяснить чего он хочет" - это обо мне, наверное.
Омлет (2009-10-18 20:10:00) [13]Ну так и перебирай сосендние ячейки, если они существуют.
kodius (2009-10-18 20:10:00) [14]Как - значит каким образом организовать перебор из букв и составить слова по указанному правилу. Ну, игра даже такая есть вконтакте - скрэмбл называется.
Сергей М. (2009-10-18 19:58:00) [15]
> С какого момента непонятно?
Вот с этого:
> как это реализовать
Что значит "как" ?
kodius (2009-10-18 19:54:00) [16]С какого момента непонятно?
Вот стринггрид с заполненными ячейками:
ф ы в а п
а к о р н
м о р а к
и н и б л
н ь ф е п
Из этих букв нужно составить слова. Но буквы можно брать не как попало, а только по соседству:
допустим, 1я ячейка - stringgrid1.cells[0,0] - там расположена буква "ф", для составления слова к этой букве можно добавлять буквы из соседствующих ячеек (буквы "ы", "к", "а"), а к букве "ы" из stringgrid1.cells[0,1] можно добавить буквы из ячейки вокруг неё ("а", "к", "о", "в") и так далее.
Сергей М. (2009-10-18 19:02:00) [17]
> как это реализовать
StringGrid.Cols[i] возвращает список значений ячеек во всех строках i-й колонки
StringGrid.Rows[i] возвращает список значений во всех колонках i-й строки
ColCount и RowCount кол-во колонок и строк соответственно.
Омлет (2009-10-18 18:53:00) [18]Ничего не понятно. Переформулируйте вопрос, приведите примеры.