Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.06;
Скачать: CL | DM;

Вниз

Перебор всех значений в stringgrid   Найти похожие ветки 

 
kodius ©   (2009-10-18 18:36) [0]

Здравствуйте, уважаемые мастера! Занялся решить следующую задачу.
Допустим, на форме есть stringgrid 5 на 5. В каждой ячейке - буква. Нужно составить из этих букв все возможные слова, причём буквы должны выбираться по правилу "соседства" - используются ячейки, находящиеся только рядом (как в игре "балда"). Подскажите, как это реализовать.


 
Омлет   (2009-10-18 18:53) [1]

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


 
Сергей М. ©   (2009-10-18 19:02) [2]


> как это реализовать


StringGrid.Cols[i] возвращает список значений ячеек во всех строках i-й колонки
StringGrid.Rows[i] возвращает список значений во всех колонках i-й строки
ColCount и RowCount кол-во колонок и строк соответственно.


 
kodius ©   (2009-10-18 19:54) [3]

С какого момента непонятно?

Вот стринггрид с заполненными ячейками:

ф  ы   в   а   п
а   к   о   р   н
м   о   р   а   к
и   н   и   б   л
н   ь   ф   е   п

Из этих букв нужно составить слова. Но буквы можно брать не как попало, а только по соседству:
допустим, 1я ячейка - stringgrid1.cells[0,0] - там расположена буква "ф", для составления слова к этой букве можно добавлять буквы из соседствующих ячеек (буквы "ы", "к", "а"), а к букве "ы" из stringgrid1.cells[0,1] можно добавить буквы из ячейки вокруг неё ("а", "к", "о", "в") и так далее.


 
Сергей М. ©   (2009-10-18 19:58) [4]


> С какого момента непонятно?


Вот с этого:


> как это реализовать


Что значит "как" ?


 
kodius ©   (2009-10-18 20:10) [5]

Как - значит каким образом организовать перебор из букв и составить слова по указанному правилу. Ну, игра даже такая есть вконтакте - скрэмбл называется.


 
Омлет   (2009-10-18 20:10) [6]

Ну так и перебирай сосендние ячейки, если они существуют.


 
kodius ©   (2009-10-18 20:12) [7]

"Конференция для начинающих, а также для тех, кому сложно объяснить чего он хочет" - это обо мне, наверное.


 
Омлет   (2009-10-18 20:14) [8]

Берешь букву, берешь первую соседнюю, если в словаре есть слова начинающиеся на этот слог, смотришь дальше соседей второй буквы, кроме изначальной, опять словарь и так далее. Рекурсивный перебор очевидно нужен.


 
kodius ©   (2009-10-18 20:15) [9]


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 - это функция, которая добавляет в список слов получившееся слово.
Приведенная выше функция осуществляет перебор всех возможных вариантов только вокруг одной ячейки. А как дальше-то быть?


 
kodius ©   (2009-10-18 20:17) [10]

Омлет, спасибо за идею! Буду пробовать.


 
RWolf ©   (2009-10-19 09:49) [11]

процедура рекурсивный_обход_комбинаций(начало_слова):

напечатать все слова из словаря, совпадающие с началом_слова
для каждого из соседей последнего символа начала_слова:
 если сосед наступает слову на хвост:
   вернуться из рекурсивного_обхода_комбинаций
 добавить соседа к началу_слова
 если ни одно слово в словаре не начинается с нового_начала_слова:
   вернуться из рекурсивного_обхода_комбинаций
 рекурсивный_обход_комбинаций(новое_начало_слова)
конец процедуры


повторить процедуру для каждой ячейки таблицы.
как-то так.


 
И. Павел ©   (2009-10-19 11:49) [12]

А я делал эту задачку так: сначала выбирал первое слово. Во все клетки, где есть первая буква этого слова ставил "1", во все клетки, смежные с клетками "1", где есть вторая буква этого слова - ставил "2", и так, пока некуда будет поставить букву или когда установится последняя буква (тогда шел назад, "раскручивая найденное слово"). Алгоритм быстрый но не учитывает "завихрения", слова, и то, что буквы в слове могут повторяться.


 
kodius ©   (2009-10-20 22:49) [13]

А код есть какой-нить для примера? Чёт ничего в голову не идёт((


 
Омлет   (2009-10-20 23:15) [14]

Код игры "балда"? ))


 
kodius ©   (2009-10-20 23:24) [15]

)) Можно и код)


 
Омлет   (2009-10-20 23:39) [16]

А яндекс кому?
http://www.delphisources.ru/pages/sources/raznoe/2007_year/balda-game.html


 
kodius ©   (2009-10-20 23:49) [17]

Благодарю! Буду разбираться в коде.


 
Германн ©   (2009-10-21 01:08) [18]


> Благодарю! Буду разбираться в коде.

Только не на форуме! :)



Страницы: 1 вся ветка

Текущий архив: 2009.12.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
15-1250841620
Empleado
2009-08-21 12:00
2009.12.06
На чем мультики делать?


15-1255008109
ocean
2009-10-08 17:21
2009.12.06
Что можно предпринять, если не ставится драйвер?


1-1227792603
Дмитрий Белькевич
2008-11-27 16:30
2009.12.06
Приложение блокирует папку после копирования файлов в неё


2-1256102379
St1m
2009-10-21 09:19
2009.12.06
Доступ к расшаренной папке


15-1254858167
Magedon
2009-10-06 23:42
2009.12.06
Delphi 2007 + Vista SP2