Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:在二维数组中查找一个或多个封闭区域_Php_Arrays_Algorithm - Fatal编程技术网

PHP:在二维数组中查找一个或多个封闭区域

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

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

例如:

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