【问题标题】:PHP: Find one or more enclosed area in a two-dimensional arrayPHP:在二维数组中查找一个或多个封闭区域
【发布时间】:2021-06-09 14:34:14
【问题描述】:

有 (10x10) 个由 0 和 1 组成的二维数组(矩阵)。需要算法(实现)来确定在这个数组中是否围绕零的闭合路径。输出是真还是假。

例如:

function findEnclosedArea($array) {
    // check $array ???

    return true/false;
}

下图说明了输出:

  • 如果数组只包含0,则返回值为真。
  • 如果数组只包含1,则返回值为false。
  • 如果有(包含一个或多个0)被1包围的“封闭区域”,则返回值为false。

【问题讨论】:

  • 你的代码在哪里?你试过什么?
  • 无代码。我不知道该怎么做。
  • 你可以尝试使用floodfill。从任何 0 元素开始,如果到最后有任何 0 元素尚未到达,您知道那些可能是封闭的,或者您开始​​的元素是封闭的。无论哪种方式,在这种情况下您都可以返回 false,否则返回 true。
  • 溢洪道。好主意!我会尽力。谢谢。
  • 感谢大家的帮助!已经解决了。 Floodfill 算法效果很好。

标签: php arrays algorithm


【解决方案1】:

感谢大家的帮助!这是正确的解决方案:

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));

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2021-04-20
    • 1970-01-01
    • 2017-09-17
    • 2021-03-03
    相关资源
    最近更新 更多