一 、什么是深搜
深度优先搜索属于图算法的一种,英文缩写为DFS即 Depth First Search。其 过 程 是
对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。 简单来说就是: 路走到头,不撞墙不回头。
BFS 本质就是让你在一幅「图」中找到从起点 start 到
终点 target 的最近距离。对的,就是这么朴实无华且枯
燥。BFS优化的本质是减少搜索次数或加快搜索效率。
案例:图的遍历
遍历如左图所示的图,图中部分结点之间有路径连接。遍历规则为:深度优先,右手路 径优先,不能重复遍历。请问遍历的结果是什么?
遍历结果:ABCDEFGHI
代码:
while (队列不为空) {
int u = 队首;
弹出队首;
for (枚举 u 的邻居) {
更新数据
if (...)
添加到队首;
else
添加到队尾;
}}
小题一练:
题目:
Mike同学在为扫地机器人设计一个在矩形区域中行走的算法,Mike是这样设计的:先把机器人放在出发点 (1,1)(1,1) 点上,机器人在每个点上都会沿用如下的规则来判断下一个该去的点是哪里。规则:优先向右,如果向右不能走(比如:右侧出了矩形或者右侧扫过了)则尝试向下,向下不能走则尝试向左,向左不能走则尝试向上;直到所有的点都扫过。
Mike为了验证自己设计的算法是否正确,打算先模拟一下这个算法,每当机器人走过一个单元格时,会在单元格内标记一个数字,这个数字从 11 开始,每经过一个单元格数字会递增 11 ,直到所有的单元格都扫一遍,也就是所有的单元格都标记过数字,机器人会自动停止。
比如:如果机器人按照上面的规则,清扫一个 3×43×4 大小的矩形区域,那么标记数字的结果如下图所示。
再比如:如果机器人按照上面的规则,清扫一个 5×55×5 大小的矩形区域,那么标记数字的结果如下图所示。
请你帮助Mike设计一个程序,按照上面的规则,将一个 n×m 大小的矩形,标记一下数字,输出最终标记的结果。
输入:
一行内有 22 个两个整数 n 和 m ,用空格隔开,分别代表矩形区域的行数(高)和列数(宽)。
1<n,m<10。
输入:
输出按题意机器人走过每个点之后,标记数字的结果,每个数字输出时场宽设置为 33。
样例:
输入 |
输出 |
3 | 1 2 3 4 |
4 | 10 1 |