Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перебор всех значений в 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]

Ничего не понятно. Переформулируйте вопрос, приведите примеры.


Наверх

Титульная страница Поиск, карта сайта Написать письмо