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;
}