感谢大家的帮助!这是正确的解决方案:
http://sandbox.onlinephpfunctions.com/code/2cb5c98f2d58079024e0890a37845489dd6e2697
<?php
// DEFINE DIMENSIONS
define("ROWS", 10);
define("COLUMNS", 10);
/**
* checkZeros
* Find zero values in the two-dimensional array,
* If found then return an array else return bool false
* @param Array $array An two-dimensional array with 0 or 1
* @return indexed Array (x, y) or Bool false
*/
function checkZeros($array) {
for($x = 0; $x < ROWS; $x++) {
for($y = 0; $y < COLUMNS; $y++) {
if($array[$x][$y] === 0) {
return array($x, $y);
}
}
}
return false;
}
/**
* floodFillWithTwos (recursive!)
* Flood fill 0s with 2s in the two-dimensional array
* Start with x, y position and steps north-east-south-west direction
* @param Array $array An two-dimensional array with 0s or 1s or 2s
* @param Array $start An indexed array with 2 values (x, y start positions) for find
* @return Bool true/false
*/
function floodFillWithTwos($array, $start = false) {
if(!$start || !is_array($start) || count($start) != 2) {
return $array;
}
$x = (int)$start[0]; $y = (int)$start[1];
if ($x < 0 || $x >= ROWS || $y < 0 || $y >= COLUMNS || $array[$x][$y] != 0) {
return $array;
}
// Filling value: 2
$array[$x][$y] = 2;
// Recursive for north, east, south and west
$array = floodFillWithTwos($array, array($x + 1, $y));
$array = floodFillWithTwos($array, array($x - 1, $y));
$array = floodFillWithTwos($array, array($x, $y + 1));
$array = floodFillWithTwos($array, array($x, $y - 1));
return $array;
}
/**
* findEnclosedArea
* Find the enclosed area in a two-dimensional array,
* If found then return false else return true
* @param Array $array An two-dimensional array with 0 or 1
* @return Bool true or false
*/
function findEnclosedArea($array) {
$x = checkZeros($array);
// If not found 0s (only 1s or 2s)
if($x === false) {
return false;
}
// Flood fill :: 0s --> 2s
$array = floodFillWithTwos($array, $x);
$x = checkZeros($array);
if($x === false) {
// If not found zeros
return true;
}
// If found zeros
return false;
}
// EXAMPLE ARRAYS
$example_1 = array(
array(0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(1, 1, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 1, 1, 1, 1),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
array(1, 0, 0, 0, 0, 1, 0, 1, 1, 1),
array(0, 1, 0, 0, 0, 1, 0, 0, 0, 0),
array(0, 0, 1, 0, 0, 1, 0, 1, 0, 0),
array(0, 0, 0, 0, 0, 1, 0, 1, 0, 0)
);
$example_2 = array(
array(0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(1, 1, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 1, 1, 1, 1, 1),
array(0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
array(1, 0, 0, 0, 0, 1, 0, 1, 1, 1),
array(0, 1, 0, 0, 0, 1, 0, 1, 0, 0),
array(0, 0, 1, 0, 0, 1, 0, 1, 0, 0),
array(0, 0, 1, 0, 0, 1, 0, 1, 0, 0),
array(0, 0, 0, 1, 0, 0, 0, 1, 0, 0)
);
$example_3 = array(
array(0, 0, 0, 0, 1, 0, 0, 1, 0, 0),
array(0, 0, 0, 0, 0, 0, 1, 0, 1, 0),
array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 1, 1, 1),
array(0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
array(1, 0, 0, 0, 0, 1, 0, 0, 0, 0),
array(0, 1, 0, 0, 0, 1, 0, 0, 1, 1),
array(0, 0, 1, 0, 0, 1, 0, 0, 0, 0),
array(0, 0, 1, 0, 0, 1, 0, 0, 0, 0),
array(0, 0, 0, 1, 0, 1, 0, 1, 0, 0)
);
$example_4 = array(
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 1, 1, 1, 0, 0, 0, 0, 0, 0),
array(0, 1, 0, 1, 0, 0, 0, 0, 0, 0),
array(0, 0, 1, 0, 0, 0, 1, 1, 1, 1),
array(0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
array(0, 1, 0, 0, 1, 0, 0, 0, 0, 0),
array(1, 0, 1, 0, 1, 0, 0, 0, 0, 0),
array(0, 1, 0, 1, 0, 0, 0, 0, 0, 0),
array(0, 0, 1, 0, 1, 0, 0, 0, 0, 0),
array(0, 0, 1, 0, 1, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
);
$example_5 = array(
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
);
$example_6 = array(
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
);
// Enclosed: false / Not-enclosed: true
var_dump(findEnclosedArea($example_1));
var_dump(findEnclosedArea($example_2));
var_dump(findEnclosedArea($example_3));
var_dump(findEnclosedArea($example_4));
var_dump(findEnclosedArea($example_5));
var_dump(findEnclosedArea($example_6));