题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
题解
此题用DFS(深度优先搜索)可以求解。
下面引用及模板参考:DFS(深度优先搜索算法)
深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
基本模板:
int check(参数)
{
if(满足条件)
return 1;
return 0;
}
void dfs(int step)
{
判断边界
{
相应操作
}
尝试每一种可能
{
满足check条件
标记
继续下一步dfs(step+1)
恢复初始状态(回溯的时候要用到)
}
}
此题代码:
function movingCount(threshold, rows, cols)
{
var visited = []
//二维标记数组,用来判断节点是否被访问,初始值都为false
for (var i = 0; i < rows; i++) {
visited.push([]);
for (var j = 0; j < cols; j++) {
visited[i][j] = false;
}
}
return movingCountCore(threshold, rows, cols, 0, 0, visited)
function movingCountCore(threshold, rows, cols, row, col, visited){
//判断边界
if( row < 0 || col < 0 || row == rows || col == cols || visited[row][col] || cal(row, col) > threshold){
return 0 //相应操作
}
//尝试每一种可能,满足条件就标记
visited[row][col] = true;
//继续下一步DFS,每次进入格子数就会加1,最终就会返回格子数
return 1 + movingCountCore(threshold, rows, cols, row + 1, col, visited)+
movingCountCore(threshold, rows, cols, row - 1, col, visited)+
movingCountCore(threshold, rows, cols, row, col + 1, visited)+
movingCountCore(threshold, rows, cols, row, col - 1, visited)
}
function cal(i, j) { //计算行坐标和列坐标的数位之和大于threshold
var s = i + '' + j, sum = 0;
for (var m = 0; m < s.length; m++) {
sum = sum + +s[m];
}
return sum;
}
}