回溯法需要考虑很多条件,如下:

1、超过边界,需要返回到原来的索引位置

2、没超过边界,但是没有找到值,需要返回到原来的索引位置

3、没超过边界,找到值

3.1 找到值之和,需要把找到的值设置为*,防止word中存在重复的元素,当循环查找时候,若存在重复元素,而没有将之前走过的路径设置为*,就会存在被认为找到,这就存在重复找到。所以必须将走过的路径的元素设置为*。

3.2 bool dfs(vector matrix, int i, int row, int col, string str)中,matrix不能加引用,因为该例子没有恢复原字符的代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix char字符型vector<vector<>> 
     * @param word string字符串 
     * @return bool布尔型
     */
    bool dfs(vector<vector<char>> matrix, int i, int row, int col, string str) {
        //先找到入口
        if (matrix[row][col] != str[i]) return false;//没找到入口,返回
        matrix[row][col] = '*';//把每次成功找到的走过的路径上的字符设置为*;防止str中存在重复的元素
    	i++;//每一次找到了之后,i=i+1

        //找到对应的值之后,找出口
        if (i == str.size()) return true; //当找到的路径数目等于字符长度,那么说明路径已经找到了

        //设置偏移量,要么向上要么向下要么向左要么向右
        int dx[4][2] = { {0,-1},{0,1},
                         {-1,0},{1,0}
                       };//分别是向左 向右 向上 向下
        for (int j = 0; j < 4; j++) //每次可以有四个方向进行移动
        {
            row = row + dx[j][0];
            col = col + dx[j][1];
            if (row >= 0 && row < matrix.size() && col >= 0 && col < matrix[0].size())
            {
                if (dfs(matrix, i, row, col, str)){//找到了
                    return true;
                }  
                    		
            }
            row = row - dx[j][0];//当超出边界,返回现场;当移动之后没找到,返回现场
            col = col - dx[j][1];
        }
        //如果没找到
        return false;
}
    bool hasPath(vector<vector<char> >& matrix, string word) {
        // write code here
        	int rowLen = matrix.size();//行数
	int colLen = matrix[0].size();//列数
	for (int i = 0; i < rowLen; i++)
	{
		for (int j = 0; j < colLen; j++)
		{
			if (dfs(matrix, 0, i, j, word))
				return true;
		}
	}
	return false;
    }
};