这是一个深度优先遍历的问题,运用到递归,递归这个东西啊,真的是说简单也简单,说复杂也复杂,关于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()是对下一行进行的操作,这样看问题就比较容易理解了,这个就是递归的思想!