题目:剑指Offer12.矩阵中的路径:
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。
如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
private:
//function:深度优先遍历
bool dfs( vector<vector<char>>& board, string word, short i, short j, short k){
if(k == word.length()) return true; //必须放在前面,避免数组中只有一个元素时出错
else if(i<0 || i > board.size()-1 || j<0 || j>board[0].size()-1) return false;
else if(board[i][j] == word[k]){
char temp = board[i][j];
board[i][j] = '%';
bool res = dfs(board, word, i-1, j, k+1) || dfs(board, word, i+1, j, k+1) ||dfs(board, word, i, j-1, k+1) ||dfs(board, word, i, j+1, k+1);
board[i][j] = temp;
return res;
}
else return false;
}
public:
bool exist(vector<vector<char>>& board, string word) {
if(word.length() == 0) return false;
for(short i=0; i<board.size(); ++i)
for(short j=0; j<board[0].size(); ++j)
if(board[i][j] == word[0])
if(dfs(board, word, i, j, 0) == true) return true;
return false;
}
};
题目:剑指Offer13.机器人的运动范围,地上有一个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。请问该机器人能够到达多少个格子?来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
时间:2020/10/29
class Solution {
private:
int countDfs(int m, int n, int i, int j, int k, vector<vector<bool>>& flag){
if(i<0 || i>=m || j<0 || j>=n ) return 0;
if( i%10 + (i%100)/10 + i/100 + j%10 + (j%100)/10 + j/100 < k && flag[i][j] == true){
flag[i][j] = false;
return countDfs(m, n, i-1, j, k, flag) + countDfs(m, n, i+1, j, k, flag)
+ countDfs(m, n, i, j-1, k, flag) + countDfs(m, n, i, j+1, k, flag) + 1;
}
}
public:
int movingCount(int m, int n, int k) {
if(n<0 || n>100 || m<0 || m>100 || k<0 || k>20) return -1;
vector<vector<bool>> flag(m, vector<bool>(n, true));
return countDfs(m, n, 0, 0, k, flag);
}
};