|
#1
|
|||
|
|||
Алгоритм
Здравствуйте. прошу подсказать мне не рекурсивный алгоритм: надо закрасить определенным цветом клетку DrawGrid'a и все клетки, такого же цвета, которые располагаются рядом с выделенной клеткой. например, если мы имеем DrawGrid 20на20 элементов и все они красного цвета и начинаем закрашивать одну клетку зеленым цветом, то закрасится весь DrawGrid, т.к. все элементы одинакового цвета и находятся рядом с выделенной кнопкой, либо соединены с ней клетками такого же цвета. конечно мог бы воспользоваться и рекурсией, но в делфи она не работает, по видимому переполнение стека)
|
#2
|
||||
|
||||
Цитата:
Вообще в теории можно любой рекурсивный алгоритм записать циклом. Еще есть например алгоритм закраски строками, правда не помню, как называется. Там вообще почти никакой нагрузки на стек не будет. jmp $ ; Happy End! The Cake Is A Lie. |
#3
|
|||
|
|||
ну суть в том, что рекурсией у меня не получилось. хотя я и не задумывался об этом варианте серьезно. написал на скорую руку рекурсию, результат - стэк переполнен. а вот в цикле такое организовать я просто не представляю как. есть какие-то мысли, но они настолько трудны, что я не представляю как это написать прошу помощи. программа готова, осталось только это( сдавать послезавтра
|
#4
|
||||
|
||||
Например можно попробовать так:
Начинается цикл. Текущую клетку (координаты X и Y) закрашиваем. Смотим соседа слева (если имеется таковой). Если его цвет нужный, то в массив (самодельный стек) заносим например 0 (чтоб знать что пришли слева), потом X уменьшаем на 1. Если же цвет не тот или нет соседа слева - аналогично для права, потом верха и потом низа, только заносить будем соответственно 1, 2 или 3. Следующий проход цикла - имеем новые координаты, и делаем все то же для них. Если у N-ной клетки не оказалось соседей - берем из массива направление, откуда пришли, и возвращаемся по нему, не выполняя сравнения для тех сторон, которые уже были (если например вернулись с цифрой 2, значит остается сравнить только для направления 3). Как-то так. Довольно сложная комбинация IF-ов. Проще рекурсией. Код:
procedure Paint(x,y:byte); begin //с DrawGrid не работал, не знаю как он там внутри устроен, напишу для массива. a[x,y]:=Color2; if x<Nx-1 then if a[x+1,y] = color1 then Paint(x+1,y); if x>0 then if a[x-1,y] = color1 then Paint(x-1,y); if y<Ny-1 then if a[x,y+1] = color1 then Paint(x,y+1); if y>0 then if a[x,y-1] = color1 then Paint(x,y-1); end; jmp $ ; Happy End! The Cake Is A Lie. |
#5
|
|||
|
|||
я думаю, этот алгоритм будет закрашивать только клетки которые находятся слева, справа,сверху,снизу на любой длине от основной клетки в пределах поля. а как же клетки, которые могут находится справа сверху. т.е. если клетка справа нам подходит по цвету и при этом клетка сверху от правой подходит по цвету, то нам надо закрасить и клетку, которая сверху от правой. а этот алгоритм разве будет это делать?
|
#6
|
||||
|
||||
Будет. Для КАЖДОЙ соседней клетки проверяется соответствие клеток слева, справа, сверху и снизу.
Только что запускал в паскале для массива 20х20. все работает нормально. Да, предварительно лучше сделать проверку, что Color1<>Color2, иначе точно будет переполнение стека. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 10.01.2011 в 15:53. |
#7
|
|||
|
|||
да такая проверка есть. сам алгоритм проверить пока нету возможности) как проверю - отпишу) заранее спасибо
|