剑指 Offer 12. 矩阵中的路径
题目描述:剑指 Offer 12. 矩阵中的路径
题解思路:面试题12. 矩阵中的路径( DFS + 剪枝 ,清晰图解)
class Solution {
public:
int rows, cols, k;
bool exist(vector<vector<char>>& board, string word) {
rows = board.size();
cols = board[0].size();
k = 0;
for(int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
bool flag = bfs(board, word, i, j, k);
if(flag)return true;
}
}
return false;
}
bool bfs(vector<vector<char>>& board, string word, int i, int j, int k){
if(i < 0 || i >= rows || j < 0 || j >= cols || board[i][j] != word[k])return false;
if(k == word.size() - 1)return true;
board[i][j] = '/0';
bool res = (bfs(board, word, i + 1, j, k + 1) || bfs(board, word, i, j + 1, k + 1)
|| bfs(board, word, i - 1, j, k + 1) ||bfs(board, word, i, j - 1, k + 1));
board[i][j] = word[k];
return res;
}
};
面试题13. 机器人的运动范围
题目描述:面试题13. 机器人的运动范围
题解思路:剑指 Offer 13. 机器人的运动范围( 回溯算法,DFS / BFS ,清晰图解)
class Solution {
public:
int mmax, nmax; //用来边界判断
int movingCount(int m, int n, int k) {
mmax = m;
nmax = n;
vector<vector<bool>> v(m, vector<bool>(n, 0)); //记录当前结点是否被访问过
return dfs(v, 0, 0, k); //开始遍历
}
int dfs(vector<vector<bool>> &v, int i, int j, int k){
if(i >= mmax || i < 0 || j >= nmax || j < 0 || v[i][j] || sum(i,j) > k)return 0; //不符合条件直接返回0
v[i][j] = true; //将符合条件的位置标记
return 1 + dfs(v, i + 1, j, k) + dfs(v, i, j + 1, k); //,符合条件的节点数加1,并对当前结点的右边下边结点进行遍历
}
int sum(int i, int j){ //计算两数各位数之和
int sum = 0;
while(i != 0){
sum += i % 10;
i /= 10;
}
while(j != 0){
sum += j % 10;
j /= 10;
}
return sum;
}
};