Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];

Вниз

Перебор всех значений в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.005 c
15-1254751574
pasha_golub
2009-10-05 18:06
2009.12.06
Хочу пример работы с istream в C++


8-1201846793
ZMRaven
2008-02-01 09:19
2009.12.06
Картинка с экрана


15-1254981541
Хм...
2009-10-08 09:59
2009.12.06
Самопроизвольное движение курсора мыши


11-1209014542
Алексей К.
2008-04-24 09:22
2009.12.06
Ошибка при обращении к StrList из своего объекта


2-1255610309
XTasy
2009-10-15 16:38
2009.12.06
Глобальные переменные delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский