题目: PHP 实现机器人的运动范围
描述:
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。
例如:
当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。
但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
php
<?php
function movingCount($threshold, $rows, $cols)
{
// write code here
$q = new SplQueue();
if($threshold <= 0 || $rows * $cols == 0){
return 0;
}
$q->push([0,0]);
$v = [];
$v[0][0] = 1;
$cnt = 0;
while(!$q->isEmpty()){
$t = $q->shift();
$cnt ++;
$i=$t[0];
$j=$t[1];
if(judge($i,$j+1,$threshold, $rows, $cols, $v)){
$v[$i][$j+1] = 1;
$q->push([$i,$j+1]);
}
if(judge($i,$j-1,$threshold, $rows, $cols, $v)){
$v[$i][$j-1] = 1;
$q->push([$i,$j-1]);
}
if(judge($i+1,$j,$threshold, $rows, $cols, $v)){
$v[$i+1][$j] = 1;
$q->push([$i+1,$j]);
}
if(judge($i-1,$j,$threshold, $rows, $cols, $v)){
$v[$i-1][$j] = 1;
$q->push([$i-1,$j]);
}
}
return $cnt;
}
function judge($i, $j, $k, $rows, $cols, &$v){
if($i >= $rows || $j >=$cols || $i < 0 || $j < 0 || (isset($v[$i]) && isset($v[$i][$j]) && $v[$i][$j] == 1)){
return false;
}
return array_sum(str_split($i)) + array_sum(str_split($j)) <= $k;
}