Показать сообщение отдельно
Старый 23.11.2010, 13:15
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 7  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Вам нужна разновидность волнового алгоритма, называемая алгоритмом Ли.
За неуважение к русскому (ну и от лени) напишу не её, а вот это)
Код AS3:
package  {
	import flash.display.*;
	public class Main extends Sprite 
	{
		public function Main():void 
		{
			var arr:Array = [[1, 2, 2, 0], 
							[1, 1, 2, 0], 
							[0, 4, 2, 3], 
							[4, 4, 2, 3],
							[0, 0, 2, 2]];
			process(arr, 0, 1);
			for (var i:int = 0; i < arr.length; ++i) {
				trace(arr[i]);
			}
		}
		public function process(arr:Array, row:int, column:int):void {
			var w:int = arr.length;
			var h:int = arr[0].length;
			var startNum:int = arr[row][column];
			for (var i:int = 0; i < w; ++i) {
				for (var j:int = 0; j < h; ++j) {
					if (arr[i][j] == startNum) arr[i][j] = 2;
					else arr[i][j] = 0;
				}
			}
			arr[row][column] = 1;
			var hasProgress:Boolean = true;
			var adds:Array = [[-1,0], [0,-1], [1,0], [0,1]];
			while (hasProgress) {
				hasProgress = false;
				for (i = 0; i < w; ++i) {
					for (j = 0; j < h; ++j) {
						for each(var add:* in adds) {
							var _x:int = i + add[0];
							var _y:int = j + add[1];
							if (_x >= 0 && _y >= 0 && _x < w && _y < h && arr[i][j] == 2 && arr[_x][_y] == 1) {
								hasProgress = true;
								arr[i][j] = 1;
							}
						}
					}
				}
			}
			for (i = 0; i < w; ++i) {
				for (j = 0; j < h; ++j) {
					if (arr[i][j] != 1) arr[i][j] = 0;
				}
			}
		}
	}
}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.