Форум: "Начинающим";
Текущий архив: 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