题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
//本题采用动态规划
//flag里面存走过的路径
function movingCount($threshold, $rows, $cols)
{
for ($i=0;$i<$rows;$i++) {
for ($j=0;$j<$cols;$j++) {
$flag[$i][$j] = false;
}
}
$count = moving($threshold, $rows, $cols, 0, 0, $flag);
return $count;
}
function moving ($threshold, $rows, $cols, $i, $j, &$flag) {
$count = 0;
if (check($threshold, $rows, $cols, $i, $j, $flag)) {
//递归遍历上下左右
$count = 1 + moving ($threshold, $rows, $cols, $i-1, $j, $flag)
+ moving ($threshold, $rows, $cols, $i, $j-1, $flag)
+ moving ($threshold, $rows, $cols, $i+1, $j, $flag)
+ moving ($threshold, $rows, $cols, $i, $j+1, $flag);
}
return $count;
}
function check($threshold, $rows, $cols, $i, $j, &$flag) {
if ($i>=0 && $j>=0 && $i<$rows && $j<$cols && !$flag[$i][$j] && getSum($i)+getSum($j)<=$threshold) {
$flag[$i][$j] = true;
return true;
} else {
$flag[$i][$j] = true;
return false;
}
}
function getSum($number) {
$sum = 0;
while ($number>0) {
$sum+=$number%10;
$number/=10;
}
return $sum;
}