1 题目及要求
1.1 题目描述
地上有一个m行n列的方格,一机器人从坐标(0, 0)的格子开始移动,每次可以向上下左右移动一格,但不能进入行坐标和;列坐标的十进制数位之和大于k的格子。例如当k是18时,能进入方格(35, 37),因为3+5+3+7=18。但不能进入方格(35,38),因为3+5+3+8=19。求机器人能够到达多少格子。
2 解答
2.1 题目分析
回溯法。
2.2 代码
int getDigitSum(int n){
int s(0);
while(n){
s+=n%10;
n /= 10;
}
return s;
}
int movingCount_m(int rows, int cols, int k, int row, int col, bool *vt){
if(!(-1<row && row<rows && -1<col && col<cols && !vt[row*cols+col] &&
getDigitSum(row)+getDigitSum(col)<=k)) return 0;
vt[row*cols+col] = true;
return 1+movingCount_m(rows,cols,k,row,col+1,vt)+
movingCount_m(rows,cols,k,row+1,col,vt)+
movingCount_m(rows,cols,k,row,col-1,vt)+
movingCount_m(rows,cols,k,row-1,col,vt);
}
int movingCount(int rows, int cols, int k){
if(rows<1 || cols<1 || k<1) return 0;
bool *vt=new bool[rows*cols];
memset(vt,0,rows*cols);
k = movingCount_m(rows,cols,k,0,0,vt);
delete[] vt;
return k;
}