解法1:创建矩阵记录访问情况
int bitSum(int num) {
int sum = 0;
while (num) {
sum += num%10;
num/=10;
}
return sum;
}
void movingRcu(int rows, int cols, int k, int row, int col, int *count, bool* visited) {
if (row < 0 || row >= rows || col < 0 || col >= cols //越界检查
|| visited[row*cols + col] == true || (bitSum(row) + bitSum(col) > k))//未访问过且符合要求
return;
*count += 1;
visited[row*cols + col] = true;
movingRcu(rows, cols, k, row+1, col, count, visited);
movingRcu(rows, cols, k, row, col+1, count, visited);
}
int movingCount(int m, int n, int k) {
if (m <= 0 || n <= 0 || k < 0) //不是k <= 0
return 0;
int cnt = 0;
bool *visited = (bool *)calloc(m*n, sizeof(bool));
movingRcu(m, n, k, 0, 0, &cnt, visited);
free(visited);
return cnt;
}
注:
1:如果不创建矩阵记录,直接递归查找的话,会栈溢出。
2:如果提交出现heap-buffer-overflow错误,请检查数组是否出现越界访问,或者检查数组创建类型和其传递类型是否一致。
3:由题意可知,机器人能达到的格子只可能从矩阵的左上角往右下角查验,而在(0,0)出发,只向下和向右移动即可满足情况。(0,0)是其相邻格子的上面和左边格子,访问某个格子的时候,其相邻上面和左边的有效格子一定是访问过的。
4:linux下编译.C文件可参考linux中怎么用gcc编译c文件。