PHP:在二维数组中查找一个或多个封闭区域
有一个由0和1组成的(10x10)二维数组(矩阵)。需要一个算法(实现),该算法确定在这个数组中是否有一个闭合的路径,即围绕零的路径。输出为真或假 例如:PHP:在二维数组中查找一个或多个封闭区域,php,arrays,algorithm,Php,Arrays,Algorithm,有一个由0和1组成的(10x10)二维数组(矩阵)。需要一个算法(实现),该算法确定在这个数组中是否有一个闭合的路径,即围绕零的路径。输出为真或假 例如: function findEnclosedArea($array) { // check $array ??? return true/false; } 下图说明了产出: 如果数组仅包含0,则返回值为true 如果数组仅包含1,则返回值为false 如果存在(包含一个或多个0)“封闭区域”被1包围,则返回值为false
function findEnclosedArea($array) {
// check $array ???
return true/false;
}
下图说明了产出:
- 如果数组仅包含0,则返回值为true
- 如果数组仅包含1,则返回值为false
- 如果存在(包含一个或多个0)“封闭区域”被1包围,则返回值为false
- 谢谢大家的帮助!这是正确的解决方案:
您的代码在哪里?你试过什么?没有密码。我不知道怎么做。你可以试着用洪水填充。从任何0元素开始,如果到最后有任何0元素尚未到达,则您知道这些元素可能是封闭的,或者从中开始的元素是封闭的。无论哪种方式,在这种情况下都可以返回false,否则返回true.Floodfill。好主意!我试试看。谢谢大家的帮助!问题已经解决了。洪水填充算法非常有效。
<?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));