Показать сообщение отдельно
Старый 23.09.2010, 19:57   #2
Venom2
 
Сообщений: n/a
Ответ: Помогите с Type

Если влоб решать, то цикл там не один, как и кол-во условий:
For cube1 = Each cube
	If cube1\use = False Then
		For cube2 = Each cube
			If cube2\use = False Then
				If cube2 <> cube1 And cube2\number_x = cube1\number_x And cube2\number_y - cube1\number_y = 1 Then
					For cube3 = Each cube
						If cube3\use = False Then
							If cube3 <> cube1 And cube3 <> cube1 And cube3\number_x = cube1\number_x And cube3\number_y - cube2\number_y = 1 Then
								Goto Found
							End If
						End If
					Next
				End If
			End If
		Next
	End If
Next
Goto NotFound
.Found
; кубы найдены.
.NotFound
Т.е. берем первый куб, и начинаем сравнивать его с другими, так чтобы number_x были равны, и соответственно разница между number_y была +1 (вдобавок нужно исключить проверку кубика с самим с собой). Как только нашли второй куб, ищем так-же (перебирая список) третий куб, получается перебор тройной вложенности. Решение в худшем случае O(N^3) сложности, поэтому лучше поискать что-то побыстрее или переформулировать саму задачу Можно оптимизировать немного, например сделать два списка (два Type) один с занятыми, другой со свободными кубиками и соответственно перемещать кубы между ними. Меньше перебирать прийдется да и условие занятости сократится. Еще можно кешировать (запоминать в отдельные переменные) поля number чтобы во внутренних циклах сократить доступ к ним.

ЗЫ
Сорри за goto, но в блице нет переменного Exit, поэтому чтобы не городить еще кучу условий проще его заюзать
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
volgeras (24.09.2010)