题意
给一个n*n的二维矩阵,矩阵中只有’.‘和’#‘这两种状态,’.‘表示可以走,’#‘是障碍,给出起点和终点,只能上下左右走(四连通),还需要注意两点:1.起点有可能就是终点 2.起点和终点都有可能是’#’
分析
题目是经典的dfs题,就判断是否到了终点没,没到终点就一直尝试往四个方向搜
解决方案
1.初始化数据,输入矩阵大小、初始化状态数组、输入起点终点坐标
2.先判断起点和终点是不是’#’,然后再判断是否为同一坐标
3.执行dfs,一直搜,如果有就标记答案变量,没有就不做标记
踩坑
我第一次做这题就TLE,不知道为什么,后来才知道原来这题不需要回溯的。。。
一开始的写法:
st[a][b] = 1;
dfs(a, b);
st[a][b] = 0;
更改后的写法:
st[a][b] = 1;
dfs(a, b);
这种类型的搜索是不用回溯的,因为多种状态可以同时更新,搜索数是这样的
而需要回溯的搜索树是这样的
以上的搜索树对应的是Leetcode79题这种类型的搜索树,每当找到符合条件的字符就更新状态,遇到不符合条件的字符就回溯到之前的节点,并恢复现场
代码
#include <iostream>
#include <cstring>
using namespace std