知·识·概·要
【迷宫问题】
上一节深搜讲了个迷宫问题,今天在回顾一下(喜)。
今天,田所浩二的好朋友井上约田所去餐厅食雪(意味深),虽然田所学会了深度优先搜索,但井上早就预料到了田所会用深搜,专门强调田所不能用深搜。于是,田所又双叒叕被困在迷宫里力(大悲)。现在他十分甚至九分的需要另一种方法帮他成功赶到餐厅。
又要用什么方法呢?那就事深搜的好兄——宽度优先搜索罢!(狂喜)
【宽度优先搜索】
什么事宽度优先搜索?
宽度优先搜索又叫广度优先搜索,简称宽搜,与深搜类似,事一种对于树而言的搜索方法,但对于图而言使用的比较多。
宽搜类似于树的层次遍历,多用于求最短路径的题目,这就事宽搜与深搜的区别。
我们继续把迷宫抽象成一棵树;
这时,我们还需要一个一个一个一个队列存储经过的结点;
首先,田所从家出发,把家放到队列中;
从家可以直接到达A
点,将A
点放到队列中,然后把家弹出(悲);
从A
点可以直接到达C
、B
、G
三个点,将C
、B
、G
依次入队,然后把A
点弹出;
从C
点可以直接到达F
、E
、D
三个点,将F
、E
、D
依次入队,然后把C
点弹出;
从B
点没有可以直接到达的点,直接弹出;
从G
点可以直接到达H
点和餐厅,将H
和餐厅依次入队,然后把G
点弹出;
F
、E
、D
、H
四个点均没有可以直接到达的点,弹出;
最后队头就事餐厅(喜),弹出,然后停止搜索。
总结:宽搜与深搜不一样,深搜类似于先根遍历,而宽搜事一层一层的查找。
【图的宽度优先遍历】
与搜索类似,只不过对于图来说,遍历需要判断结点事否访问过,递进时判断事否被标记过。
一样,以这个图为例,规定以1
为起点并将其标记,此时还需要一个一个一个一个队列;
首先将1
入队;
从1
可以直接到达2
和4
两个未标记结点,将2
和4
标记并入队后,弹出1
;
从2
可以直接到达3
和5
两个未标记结点,将3
和5
标记并入队后,弹出2
;
4
、3
、5
三个结点都没有可以直接到达的未标记结点,弹出;
此时栈为空,停止遍历。
拓·展·知·识
【方向数组】
什么事方向数组?
方向数组事解决二维数组最短路径问题时常用的两个一维数组,一般命名为dx
和dy
。
在解决四方向、八方向以及马步路径问题时十分甚至九分的常用。
在这里田所把各种问题的方向数组都打出来,有需要可以复制罢(悲)。
四方向:
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
八方向:
int dx[]={1,1,0,-1,-1,-1,0,1};
int dy[]={0,1,1,1,0,-1,-1,-1};
马步:
int dx[]={1,2,2,1,-1,-2,-2,-1};
int dy[]={2,1,-1,-2,-2,-1,1,2};
课·后·练·习
【题目描述】
在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个100
×100
的围棋盘上任选两点A
、B
,A
点放上黑子,B
点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)
的点时,谁获胜。现在他请你帮忙,给你A
、B
两点的坐标,想知道两个位置到(1,1)
点可能的最少步数。
提示:棋盘左上角坐标为(1,1)
,右下角坐标为(100,100)
【输入描述】
A
、B
两点的坐标。
【输出描述】
最少步数。
【输入样例】
12 16
18 10
【输出样例】
8
9
那么这期导学就到这里,压力马斯内!!!