题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
思路:使用回溯算法。创建数组记录访问状态,每次向上,下,左,右移动一个进行继续访问,检查每次进入方格是否满足条件,如满足条件则记录访问状态并进行下一步处理,如不满足条件则该分支提前结束。
class Solution {
public:
int movingCount(int threshold, int rows, int cols)
{
if (threshold < 0 || rows <= 0 || cols <= 0) {
return 0;
}
bool *visited = new bool[rows*cols];
for (int i = 0; i <rows*cols; i++)
{
//二维数组这些结点未遍历
visited[i] = false;
}
int result = moveCountCore(rows,cols,0,0,visited,threshold);
delete[] visited;
return result;
}
//判定是否满足回溯条件
bool check(int rows,int cols,int row,int col,bool*visited,int threshold) {
if (row >= 0
&& col >= 0
&& row < rows
&&col < cols
&& visited[row*cols + col] == false
&& (dataBitSum(row) + dataBitSum(col) <= threshold)) {
return true;
}
return false;
}
//控制机器人移动
int moveCountCore(int rows, int cols, int row, int col, bool*visited, int threshold) {
int count = 0;
if (check(rows,cols,row,col,visited,threshold)) {
//该格子未被访问,访问后下次不再遍历
visited[row*cols + col] = true;
count = 1 + moveCountCore(rows, cols, row - 1, col, visited, threshold)
+ moveCountCore(rows, cols, row, col + 1, visited, threshold)
+ moveCountCore(rows, cols, row + 1, col, visited, threshold)
+ moveCountCore(rows, cols, row - 1, col, visited, threshold);
}
return count;
}
//判别一个数字的各位数之和
int dataBitSum(int data) {
int sum=0;
while (data != 0)
{
//如90
sum = sum + data % 10;
data = data / 10;
}
return sum;
}
};
网友评论