剑指offer-面试题13-机器人的运动范围-递归法

/*
题目:
	地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始运动,
	每次可向上、下、左、右移动一格,但不能进入行坐标和列坐标之和大于k的格子。
	如,当k=18时,机器人能进入(35,37),因为3+5+3+7=18。
	但不能进入(35,38),问机器人能够到达多少格子。
*/
/*
思路:
	递归法。
	机器人从第一个格子走;
	计算机器人向左、右、上、下可走的格子数之和。
	使用visited进行标注,防止已走过的格子被重复计数。
	
*/

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
bool isValid(int row,int col,int threshold){
    int num = 0;
    while(row != 0){
        num += row % 10;
        row = row / 10;
    }
    while(col != 0){
        num += col % 10;
        col = col / 10;
    }
    return num > threshold ? false : true;
}
int movingCounCore(int row,int col,int rows,int cols,int threshold,bool* visited){
    int myCount = 0;
    //cout<<row<<" "<<col<<endl;
    if(row >= 0 && col >=0 && row < rows && col < cols && !visited[cols*row+col] && isValid(row,col,threshold)){
        visited[row*cols + col] = true;
        myCount = 1+movingCounCore(row+1,col,rows,cols,threshold,visited) + movingCounCore(row,col+1,rows,cols,threshold,visited) +
                           movingCounCore(row-1,col,rows,cols,threshold,visited) + movingCounCore(row,col-1,rows,cols,threshold,visited);
    }
    return myCount;

}
int movingCount(int threshold,int rows,int cols){
    if(threshold < 0 || rows <= 0 || cols <= 0){
        return 0;
    }
    bool *visited = new bool[rows*cols];
    memset(visited,false,rows*cols);
    int myCount = movingCounCore(0,0,rows,cols,threshold,visited);
    delete[] visited;
    return myCount;
}



int main(){
    cout<<movingCount(5,2,2)<<endl;
}

   

上一篇:Python删除list中多个相同元素


下一篇:httping使用