搜索 #1 DFS讲解
预计会出三章,第一章是DFS,第二章是BFS,第三章是回溯。
DFS(Depth-First Search)的中文名字叫做深度优先搜索,它是搜索的一种,最多的我们拿他来实现求联通块、地图的问题。
DFS的实现原则是“一条路走到黑,不撞南墙不回头”,也就是你按着你的路走下去,哎呀,发现前面全都是墙了,才慌忙掉头回去,那么也就是每一个地图点都遍历一遍,时间复杂度大约是O(nm)。
DFS是递归的一种,它要利用visit/vis(标记)数组来记录是否这个被访问过了,用字符串/int类型来储存输入的地图/数字串,还要定义方向数组,不然代码会非常繁琐,也很容易出错。
DFS最容易出错的就是方向数组和是否执行的判断,为此,相信学过DFS的人会觉得非常头疼导致 精神失常 你编代码的时候思路很乱。
那么,接下来小编就来几个开胃题给大家做做,DFS的精华都在里面了。
第1题 迷宫
题目描述
一天 Extense 在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n * n
的格点组成,每个格点只有2种状态,.
和 #
,前者表示可以通行后者表示不能通行。同时当 Extense 处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上。Extense 想要从点 A 走到点 B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为 #
),则看成无法办到。
输入格式
- 第1行是测试数据的组数
k
,后面跟着k
组输入。 - 每组测试数据的第1行是一个正整数
n
(1 ≤ n ≤ 100
),表示迷宫的规模是n * n
的。 - 接下来是一个
n * n
的矩阵,矩阵中的元素为.
或者#
。 - 再接下来一行是4个整数
ha, la, hb, lb
,描述 A 处在第ha
行, 第la
列,B 处在第hb
行, 第lb
列。注意到ha, la, hb, lb
全部是从 0 开始计数的。
输出格式
k
行,每行输出对应一个输入。能办到则输出 “YES”
,否则输出 “NO”
。
输入/输出例子
输入 #1
2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0
输出 #1:
YES
NO