1. 程式人生 > >劍指offer——機器人運動範圍

劍指offer——機器人運動範圍

題目描述:地上有一個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;
    }
};