剑指offer第13题:机器人的活动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
我的解法:
维护一个bool值的矩阵,当走进空格时将值置为true,传引用,最后再计算矩阵中为true的格子的数量。
class Solution {
public:
int Check_sum(int row, int col){
int sum_row = 0;
int sum_col = 0;
while (row>0){
sum_row += row % 10;
row = row / 10;
}
while (col>0){
sum_col+=col % 10;//当时由于少了一个加号,找了半天的bug;
col = col / 10;
}
return sum_col + sum_row;
}
void movingCountCore(vector<vector<bool>>&nums, int threshold, int rows, int cols, int row, int col){
int check = Check_sum(row, col);
if (row >= 0 && row < rows&&col >= 0 && col < cols&& check<= threshold&&nums[row][col] == 0){
nums[row][col] = 1;
movingCountCore(nums, threshold, rows, cols, row -1, col);
movingCountCore(nums, threshold, rows, cols, row , col-1);
movingCountCore(nums, threshold, rows, cols, row+1, col );
movingCountCore(nums, threshold, rows, cols, row, col + 1);
}
else
return;
}
int movingCount(int threshold, int rows, int cols)
{
if (rows == 0 && cols == 0)return 0;
vector<vector<bool>>nums(rows, vector < bool>(cols, 0));
movingCountCore(nums, threshold, rows, cols, 0, 0);
int result = 0;
for (int i = 0; i < rows; i++){
for (int j = 0; j < cols; j++){;
if (nums[i][j] == 1){
result++;
}
}
}
return result;
}
};
答案解法:
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 count = movingCountCore(threshold, rows, cols,
0, 0, visited);
for (int i = 0; i < rows; i++){
for (int j = 0; j < cols; j++){
cout << visited[i*cols + j]<<' ';
}
cout << endl;
}
delete[] visited;
return count;
}
int movingCountCore(int threshold, int rows, int cols, int row,
int col, bool* visited)
{
int count = 0;
if (check(threshold, rows, cols, row, col, visited))
{
visited[row * cols + col] = true;
count = 1 + movingCountCore(threshold, rows, cols,
row - 1, col, visited)
+ movingCountCore(threshold, rows, cols,
row, col - 1, visited)
+ movingCountCore(threshold, rows, cols,
row + 1, col, visited)
+ movingCountCore(threshold, rows, cols,
row, col + 1, visited);
}
return count;
}
bool check(int threshold, int rows, int cols, int row, int col,
bool* visited)
{
if (row >= 0 && row < rows && col >= 0 && col < cols
&& getDigitSum(row) + getDigitSum(col) <= threshold
&& !visited[row* cols + col])
return true;
return false;
}
int getDigitSum(int number)
{
int sum = 0;
while (number > 0)
{
sum += number % 10;
number /= 10;
}
return sum;
}