地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
思路:采用递归的方法,从(0, 0)出发,先检查能否进入(i, j)格子,如果能,则进一步检查能否进入(i, j)周围的格子:(i-1, j) (i, j-1) (i+1, j) (i, j+1)。
程序:
/* 2016-09-20
author by chenjiaying
功能: 机器人能到达的格子数
参数:格子行与列的数位之和:theshold 总行数:rows 总列数:cols
*/
int movingCount(int threshold, int rows, int cols)
{
bool *visited = new bool[rows*cols] ; //用于标志是否访问过
for(int i = 0; i<rows*cols; ++i)
{
visited[i] = false;
}
int count = moving( visited, rows, cols, 0, 0,threshold);
delete[] visited;
return count;
}
int moving( bool *visit, int rows, int cols, int row, int col, int thre)
{
int count = 0;
if(judge(visit, rows, cols, row, col, thre)){
visit[row*cols+col] = true;
count = 1+ moving(visit,rows,cols,row-1,col,thre) //错误的写为int count = 1+......
+moving(visit,rows,cols,row+1,col,thre)
+moving(visit,rows,cols,row,col-1,thre)
+moving(visit,rows,cols,row,col+1,thre);
}
return count;
}
//判断能够进入第row行 第col列
bool judge(bool *visit, int rows, int cols, int row, int col, int thre)
{
if(row>=0&&row<rows&& col>=0 &&col<cols &&visit[row*cols+col] == false && getNum(row, col)<=thre)
return true;
else
return false;
}
//计算坐标的数位之和
int getNum(int row,int col)
{
int row_n = 0, sum_row = 0;
while(row){
row_n = row%10;
row = row/10;
sum_row = sum_row + row_n;
}
int col_n = 0, sum_col = 0;
while(col){
col_n = col % 10;
col = col/10;
sum_col += col_n;
}
return sum_row+sum_col;
}