剑指offer-66:机器人的运动范围
目录
1题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。
例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
2动态二维数组
访问数据的方式:通过a[i*10+j]来访问第(i*10+j)个数据。
优缺点:访问数据很方便,且new的次数少,释放空间容易,但是不便于理解。
3动态申请数组和参数传递问题
使用new申请内存,最后,使用delete函数释放内存。
int ** ga = new int*[row];
for(int i = 0; i < row ; i++)
ga[i] = new int[col];
for(i = 0; i < row; i++)
delete []ga[i];
delete []ga;
对于动态申请的二维数组,使用指针对其进行操作,在参数传递的过程中,由于传递的是指针,故在函数内部的操作,都会影响到数组本身。具体的例子如下:
#include<iostream>
using namespace std;
void print(int row,int col,int **ga)
{
for(int i = 0;i < row ; i++)
{
for(int j = 0;j < col; j++)
{
cout<<ga[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
void set(int row,int col,int **p)
{
for(int i = 0;i < row ; i++)
{
for(int j = 0;j < col; j++)
{
p[i][j] = 5;
}
}
}
int main()
{
int row,col;
cout<<"input row"<<endl;
cin >>row;
cout<<"input col"<<endl;
cin >> col;
//动态申请二维数组
int ** ga = new int*[row];
for(int i = 0; i < row ; i++)
ga[i] = new int[col];
for(int i = 0;i < row ; i++)
for(int j = 0;j < col; j++)
{
ga[i][j] = i+j;
}
print(row,col,ga);
set(row,col,ga);
print(row,col,ga);
//回收内存
for(int i = 0; i < row; i++)
delete []ga[i];
delete []ga;
return 0;
}
3题目分析
class Solution {
public:
int movingCount(int threshold, int rows, int cols) {
//动态申请二维数组flag,记录是否已经走过
int ** flag = new int*[rows];
for(int i = 0; i < rows ; i++)
flag[i] = new int[cols];
return helper(0, 0, rows, cols, flag, threshold);
}
int helper(int i, int j, int rows, int cols, int **flag, int threshold) {
if (i < 0 || i >= rows || j < 0 || j >= cols || numSum(i) + numSum(j) > threshold || flag[i][j] == 1) return 0;
flag[i][j] = 1;
return helper(i - 1, j, rows, cols, flag, threshold)
+ helper(i + 1, j, rows, cols, flag, threshold)
+ helper(i, j - 1, rows, cols, flag, threshold)
+ helper(i, j + 1, rows, cols, flag, threshold)
+ 1;
}
int numSum(int i) {
int sum = 0;
do{
sum += i%10;
}while((i = i/10) > 0);
return sum;
}
};