劍指offer——機器人運動範圍
阿新 • • 發佈:2019-01-04
題目描述:地上有一個m行n列的方格,一個機器人從座標(0,0)的格子開始移動,可以向左右上下四個方向,但是不能進入行座標和列座標的數位之和大於k的格子。請問機器人能夠達到多少個格子?
解題思路:這道題目也是一道典型的回溯法題目,可以用遞迴來寫。寫遞迴的思路都相似的,通過變化若干個引數呼叫自己所在的函式。重點在於遞迴出口的編寫。因為本題要求滿足條件格子的數量,如果某個格子不滿足條件,則返回count=0即可;否則繼續遍歷四個方向的格子。還需要注意的一點就是要穿是否訪問過陣列的引用。
class Solution { public: int num(int n) { int res=0; while(n!=0) { res+=n%10; n=n/10; } return res; } int count(int threshold,int rows,int cols,int row,int col,vector<int>& visited) { int ct=0; if(row>=0 && row<rows && col>=0 && col<cols && num(row)+num(col)<=threshold && (visited[row*cols+col]==0))//條件滿足 { visited[row*cols+col]=1; ct=1+count(threshold,rows,cols,row-1,col,visited)+count(threshold,rows,cols,row+1,col,visited)+ count(threshold,rows,cols,row,col-1,visited)+count(threshold,rows,cols,row,col+1,visited); } return ct; } int movingCount(int threshold, int rows, int cols) { if(threshold<=0 && rows<=0 && cols <=0) { return 0; } int row=0,col=0; vector<int> visited(rows*cols,0); int res=count(threshold,rows,cols,row,col,visited); return res; } };