1321 棋盘问题 对深度优先遍历(DFS)的初步理解

这是一个深度优先遍历的问题,运用到递归,递归这个东西啊,真的是说简单也简单,说复杂也复杂,关于DFS的应用是很广的,我理解的不是很深,以前学数据结构时,对图的深度优先遍历是理解了,我以为DFS就这样用,甚至以为,DFS只能再图里用,现在碰到很多DFS的题,我却一筹莫展,才明白了,DFS这么有用,而且不止在图里用,之所以我对别的题型不会做,是因为对DFS理解不深,不会灵活应用,在这里,借助这个题,对DFS的思路做一次比较清晰的“理顺”。

题意就不说了,直接借助一个具体的例子,说一下遍历的思路和过程。

例子:

 

4 2

.##.

#.#.

.#..

#...

画出形象的棋盘,就是如下图:

 

.

#

#

.

#

.

#

.

.

#

.

.

#

.

.

.

行号和列号分别是0 1 2 3。

 

这里的深度优先就是先从第0行开始,找到第一个可以放棋子的位置,即(0,1),标记该位置所在的列,从该位置进行深度遍历a,就是找下一行的第一个可以放棋子的位置,即(1,0),然后再从该位置,进行深度遍历b,因为此时已经找到了两个不在同一行,不在同一列的位置,就不再继续进行深度遍历b,而跳出当前的遍历,继续对第1行进行扫描,找第2个可以放棋子的位置,即(1,2),再从该位置进行深度遍历c,但因为已满足条件,所以就不再继续进行遍历c,而跳出,继续对第1行扫描。对第1行扫描完成后,就对第2行扫描,依照前述过程,直到扫描完第3行,然后依次跳出当前的遍历,而回到了第0行,对第0行的第2个可以放棋子的位置,再次进行深度遍历,依然是依前述过程,如此,再对第1行,进行的每个位置,进行深度遍历,再对第2、3行……

 

依照上述过程,遍历的次序依次是:

(0,1):(1,0)(1,2)(3,0)

(0,2):(1,0)(2,1)(3,0)

(2,0):(2,1)

(2,2):(2,1)(3,0)

(2,1):(3,0)

这个过程不是很好说,看一下程序,调试一下,再仔细体会一下:

 

从整体来看,可以这样看待深度遍历:那个for循环是对当前行的操作,在这里面进行深度遍历,最后的那个search()是对下一行进行的操作,这样看问题就比较容易理解了,这个就是递归的思想!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值