![]()  | 
	
 
  | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Здравствуйте. прошу подсказать мне не рекурсивный алгоритм: надо закрасить определенным цветом клетку DrawGrid'a и все клетки, такого же цвета, которые располагаются рядом с выделенной клеткой. например, если мы имеем DrawGrid 20на20 элементов и все они красного цвета и начинаем закрашивать одну клетку зеленым цветом, то закрасится весь DrawGrid, т.к. все элементы одинакового цвета и находятся рядом с выделенной кнопкой, либо соединены с ней клетками такого же цвета. конечно мог бы воспользоваться и рекурсией, но в делфи она не работает, по видимому переполнение стека) 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 Вообще в теории можно любой рекурсивный алгоритм записать циклом. Еще есть например алгоритм закраски строками, правда не помню, как называется. Там вообще почти никакой нагрузки на стек не будет.  | 
| 
		 
			 
			#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;  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 я думаю, этот алгоритм будет закрашивать только клетки которые находятся слева, справа,сверху,снизу на любой длине от основной клетки в пределах поля. а как же клетки, которые могут находится справа сверху. т.е. если клетка справа нам подходит по цвету и при этом клетка сверху от правой подходит по цвету, то нам надо закрасить и клетку, которая сверху от правой. а этот алгоритм разве будет это делать? 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Будет. Для КАЖДОЙ соседней клетки проверяется соответствие клеток слева, справа, сверху и снизу. 
		
	
		
		
		
		
			
		
		
		
		
		
			Только что запускал в паскале для массива 20х20. все работает нормально. Да, предварительно лучше сделать проверку, что Color1<>Color2, иначе точно будет переполнение стека. Последний раз редактировалось Bargest, 10.01.2011 в 15:53.  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 да такая проверка есть. сам алгоритм проверить пока нету возможности) как проверю - отпишу) заранее спасибо  
		
	
		
		
		
		
		
	
		
		
	
	
	![]()  |