「回溯算法」LeetCode79. 单词搜索
DFS
、回溯算法
、Flood Fill算法
本文章参考了许多他人的笔记,仅供自己学习复习使用。
leetcode官网
liweiwei李威威:解答多为java编写,思路非常清晰,读他的笔记对学习很有帮助。
负雪明烛:偶然在知乎看到,受到其leetcode刷题建议的指导。5 年在 CSDN 上更新了 800多道题解,收获 160万 阅读。在中文力扣日更题解。
问题描述
提示:这里描述项目中遇到的问题:
例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据
APP 中接收数据代码:
题目分析:
问题思路:
我们首先先遍历二维矩阵,只要找到了这个单词的首字母,就可以在这个起点上搜索第 2 个字符,搜索字符的过程,应该注意一点,那就是,在尝试搜索的时候,已经搜索过的地方应该占住这个位置,如果四个方向都搜索不到结果,就应该释放对当前结点的占用,回退上上一格,继续搜索。(转载自: https://liweiwei1419.gitee.io/leetcode-algo/2018/02/06/leetcode-solution/backtracking-6/)
代码tips:
1、使用方向数组
,表示 上下左右 4 个方向(具体方向根据题目要求可能变化);
2、使用 marked 数组标记当前位置是否被使用过
(marked数组的具体体现可能变化,如本题,会对像素点的颜色进行修改,修改之后相当于标记了当前位置已被访问);
3、判断当前位置是否越界
。
实现代码1(C++,DFS)
class Solution {
public:
int dir[4][4]={{-1,0}, {0, -1}, {1, 0}, {0, 1}};
// 判断是否存在单词的函数
bool exist(vector<vector<char>>& board, string word) {
// 图的行数m和列数n
int m=board.size();
int n=board[0].size();
vector<vector<bool>> visited(m,vector<bool>(n));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(dfs(i,j,0,board,word,visited))
return true;
}
}
return false;
}
//dfs函数
bool dfs(int x,int y,int index,vector<vector<char>>& board,string &word,vector<vector<bool>>& visited){
// 当index等于最后一个字符的下标:
// 判断当前board和word所指向的字母是否一样,是则返回true
if(index == word.size()-1){
return word[index]==board[x][y];
}
// 当index没到最后一个字符时:
// 判断当前board和word所指向的字母是否一样,是则标记visited,并返回true
if(word[index]==board[x][y]){
visited[x][y]=true;
for(int i=0;i<4;i++){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(nx >= 0 && nx < board.size()&& ny >= 0 && ny < board[0].size() && !visited[nx][ny]){
if(dfs(nx,ny,index+1,board,word,visited)){
return true;
}
}
}
visited[x][y]=false;//若此路不通,需还原状态
}
return false;
}
};
/*pay attention:
(1)低级错误:传参时nx、ny写成x、y,导致了runtimeError
(2)如何用函数inArea()代替一长串的越界判断?
*/
2022.5.23