这是我们工作中的一个愚蠢的小问题,我们中的一些人有不同的解决方案,我们想知道是否有更好的方法来做到这一点。为了举个例子,我会把它归结为一些非常简单的东西。
假设我们有一个多维数组,其中包含以下值。每个值都是它自己的元素,每一行都是一个数组。
0A00
000B
C000
在上面的“数组”中,$ array [0] [1]为“a”,$ array [1] [3]为“b”,$ array [2] [0]为“ C”。我们需要做的是将与非数值相邻的所有值递增1.因此,在我们递增值之后的数组应该类似于下面的数组。我们当前的解决方案是首先检查数组的所有4个“角”,增加相邻值,然后检查顶行和底行,然后检查第一列和最后一列,最后检查所有其他元素。每当我们点击一个非数字元素时,我们将所有其他相邻的非数字元素递增1.这有点蹩脚/笨重,我们知道必须有更好的方法。当你知道所有炸弹的位置时,它几乎是反向建造一个轰炸机板。
1a21
222B
C111
答案 0 :(得分:1)
有趣的小谜题。请尝试以下方法:
$arr = array(
array(0, 'a', 0, 0),
array(0, 0, 0, 'b'),
array('c', 0, 0, 0),
);
$max_i = count($arr);
$max_j = count($arr[0]);
for ($i = 0; $i < $max_i; $i++) {
for ($j = 0; $j < $max_j; $j++) {
if (!is_int($arr[$i][$j])) {
for ($_i = $i - 1; $_i <= $i + 1; $_i++) {
for ($_j = $j - 1; $_j <= $j + 1; $_j++) {
if (($_i == $i && $_j == $j) || $_i < 0 || $_i >= $max_i || $_j < 0 || $_j >= $max_j) {
continue;
}
if (is_int($arr[$_i][$_j])) {
$arr[$_i][$_j]++;
}
}
}
}
}
}
不确定这是否是最有效的方法,但它应该比你的更短。
答案 1 :(得分:1)
我想到了这个简单的算法:
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次。