深度优先和广度优先的搜索
步骤:
- 模式识别:更适合广度优先还是深度优先
- 确定当前的状态,根据状态进行递归操作
- 确定递归的模式(可使用队列进行辅助)
- 查看是否需要记录状态
Example
机器人走路
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
class Solution {
int result = 0;
boolean[][] map;
public int movingCount(int m, int n, int k) {
map = new boolean[m][n];
//1.列出m,n的矩阵
//2.写出计算函数
//3.确定当前状态
//4.进行递归,记录状态
//结果进行计数
//边界和极值0
//递归
f(0,0,m,n,k);
return result;
}
public void f(int x, int y ,int m ,int n, int k){
if(!checkLimit(x,y,m,n)) return;
if(!checkSum(x,y,k)) return;
result += 1;
map[y][x] = true;
f(x+1,y,m,n,k);
f(x,y+1,m,n,k);
f(x-1,y,m,n,k);
f(x,y-1,m,n,k);
}
public boolean checkLimit(int x, int y, int m,int n){
if(x<0 || x >= n) return false;
if(y<0 || y>= m) return false;
if(map[y][x]) return false;
return true;
}
public boolean checkSum(int x ,int y, int k){
int count = 0;
while(x / 10 > 0){
count += x % 10;
x = x / 10;
}
count += x;
while(y / 10 > 0){
count += y%10;
y = y / 10;
}
count += y;
if(k < count) return false;
return true;
}
}