C语言解机器人的运动范围

解题思路

这道题和上面一道回溯类似,但是这道应该不算回溯,而是DFS深度优先遍历,使用递归地方式进行遍历。判断当前位置是否符合要求,然后设置为已访问!接下来访问上下左右四个格子,以此类推。

DFS算法

1. 递归出口:

1.1 超出边界
1.2 已访问过
1.3 条件不符合

2. 设置已访问

2.1 flag=1;
2.2 count++;

3. 上下左右递归

DFS(i-1,j)
DFS(i+1,j)
DFS(i,j-1)
DFS(i,j+1)
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param threshold int整型 
 * @param rows int整型 
 * @param cols int整型 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
static int s_row=0;
static int s_col=0;
static flag[100][100]={0};
static count=0;
//判断num1 的所有数字和num2的所有数字 之和小于num3
int judge(int num1,int num2,int num3){
    int sum=0;
    while(num1>0){
        sum+=num1%10;
        num1=num1/10;
    }
    while(num2>0){
        sum+=num2%10;
        num2=num2/10;
    }
    if(sum<=num3)
        return 1;
    else return 0;
    
}
//计算所有连续路径
int DFS(int i,int j,int threshold){
    //出口条件 超出边界,或者超出范围 或者已经访问过
    if(i>=s_row||i<0||j>=s_col||j<0||judge(i,j,threshold)==0||flag[i][j]==1)
        return 0;
    //接下来 可以访问
    flag[i][j]=1;
    count++;
    //接下来进行 上下左右的递归
    int res=(DFS(i+1,j,threshold)||
    DFS(i-1,j,threshold)||
    DFS(i,j+1,threshold)||
    DFS(i,j-1,threshold));
    return res;
    
    
}
int movingCount(int threshold, int rows, int cols ) {
    s_row=rows;
    s_col=cols;
    DFS(0,0,threshold);
    return count;
}