Вам нужна разновидность волнового алгоритма, называемая алгоритмом Ли.

Код 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;
}
}
}
}
}