剑指Offer(一)机器人的运动范围

    心血来潮,看到很多很棒的题解博客,心想自己这几个月还没有好好地刷一遍剑指offer,每次都是从头刷,然而刷到三分之一处就坚持不下来了,希望这一次以此为契机,鼓励自己加油。前面的题目做过好多遍了,就从牛客网上的最后一题开始吧。

题目:

    地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?


思路:

当机器人准备进入某一个格子时,首先用阈值和边界以及是否曾经被visit了来判定其是否可以进入,然后再判定其是否可以进入周围的4个格子,使用回溯算法。


程序代码

(代码是很快完成了,因为一个数组越界的问题,困扰了半个小时,好在终于解决了)

class Solution {
public:
    int movingCount(int threshold, int rows, int cols)
    {
        if(threshold<0 || rows<=0 || cols<=0)
            return 0;
        bool *visited=new bool[rows*cols];
        for(int i=0;i<rows*cols;++i)
            visited[i]=false;
        int num=getPlace(threshold,rows,cols,0,0,visited);
        //cout<<num<<endl;
        delete[] visited;
        return num;

    }
     int getPlace(int threshold,int rows,int cols,int row,int col,bool *visited)
     {
         int sumofCoordinate=0;
         if(row<0 || row>=rows || col<0 || col>=cols)
         return 0;
         sumofCoordinate=getSum(row)+getSum(col);
         int num=0;
         if(row>=0 && col>=0 && row<=rows && col<=cols && sumofCoordinate<=threshold && visited[row*cols+col]==false)
         {
            visited[row*cols+col]=true;
            num=1+getPlace(threshold,rows,cols,row+1,col,visited)
                    +getPlace(threshold,rows,cols,row,col+1,visited)
                    +getPlace(threshold,rows,cols,row-1,col,visited)
                    +getPlace(threshold,rows,cols,row,col-1,visited);
         }
          return num;
     }

    int getSum(int x)
    {
        int sum=0;
        while(x%10 != x)
        {
            sum=sum+x%10;
            x=x/10;
        }
        sum=sum+x;
        return sum;
    }

};

主程序:

int main()
{
    Solution s;
    int p=s.movingCount(3,4,4);
    cout<<p<<endl;

}

运行结果:


猜你喜欢

转载自blog.csdn.net/Bubbler_726/article/details/80909203