PHP - 如何判断多维数组中的所有相邻元素是否存在?

标签 php arrays algorithm multidimensional-array

这是我们在工作中遇到的一个愚蠢的小问题,我们中的一些人有不同的解决方案,我们想知道是否有更好的方法来做到这一点。为了举例,我会将其归结为非常简单的事情。

假设我们有一个多维数组,其中包含以下值。每个值都是它自己的元素,每行都是一个数组。

0a00
000b
c000

在上面的“数组”中,$array[0][1] 为“a”,$array[1][3] 为“b”,$array[2][0] 为“C”。我们需要做的是将所有与非数字值相邻的值加 1。因此,增加值后的数组应如下所示。我们当前的解决方案是首先检查数组的所有 4 个“角”,递增相邻的值,然后检查顶行和底行,然后检查第一列和最后一列,最后检查所有其他元素。每当我们遇到一个非数字元素时,我们就会将所有其他相邻的非数字元素增加 1。这有点蹩脚/麻烦,但我们知道必须有更好的方法。当你知道所有炸弹在哪里时,这几乎就是反向构建一个扫炸弹板。

1a21
222b
c111

最佳答案

我想到了这个简单的算法:

function getNeighborsCount($rgData, $iX, $iY)
{
   if(ord($rgData[$iX][$iY])>=ord('a') && ord($rgData[$iX][$iY])<=ord('z'))
   {
      return null;
   }
   $iResult = 0;
   for($i=$iX-1; $i<=$iX+1; $i++)
   {
      for($j=$iY-1; $j<=$iY+1; $j++)
      {
         if(isset($rgData[$i][$j]) && 
            ord($rgData[$i][$j])>=ord('a') && 
            ord($rgData[$i][$j])<=ord('z'))
         {
            $iResult++;
         }
      }
   }
   return $iResult;
}

-然后将其应用于整个数组:

$rgData = [
   str_split('0a00'),
   str_split('000b'),
   str_split('c000')
];

for($i=0; $i<count($rgData); $i++)
{
   for($j=0; $j<count($rgData[$i]); $j++)
   {
      if($iCount = getNeighborsCount($rgData, $i, $j))
      {
         $rgData[$i][$j]=$iCount;
      }
   }
}

-这将导致

echo(join(PHP_EOL, array_map(function($rgStr)
{
   return join('', $rgStr);
}, $rgData)));

至:

1a21
222b
c111

现在,关于复杂性。如果我们有 N 个元素,则其时间复杂度将为 O(9N),因为我们要为函数内的每个元素迭代 9 次。

关于PHP - 如何判断多维数组中的所有相邻元素是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18953268/

相关文章:

javascript - Ajax返回成功但不更新数据库

c - 用C语言打开文件时出现段错误?

algorithm - 确定图形是否包含三角形?

PHP PDO,连接有效,购买查询未执行

php - 如何将数组作为参数传递给 Yii2 gridview 列

PHP : edit issued invoice

arrays - tcl 数组问题 - 带引号的键

python - 获取数组范围的开始和结束

algorithm - 具有具有流动能力的节点的图的 Edmonds-Karp 算法

java - 在二维矩阵中找到最左边和最右边角之间的最短路径