题目描述
题解
思路:理解题目,找到R在哪以后,R只能往上下左右走,走几格都行,但是只要走了方向就不能改变了,因为题目要求的是在一次移动中捕获到的车的数量。
所以其实就是一棵树,根节点是R,上下左右为4条树枝,每条树枝也只有一条分叉,因为确定移动方向后就不能变了。
根据这个树,就想到了 DFS。
DFS一般都是作为一个子函数调用的。
结合代码看:因为题目要返回的结果只是要求计数,没有要求返回路径,所以dfs子函数就不需要添加全局变量来保存每一次的结果。
上代码
class Solution:
def numRookCaptures(self, board):
def findR(board): # 遍历找到 R 的位置
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j] == 'R':
return [i,j]
return None
def dfs(i,j,board,w,q): # 深度优先遍历
i += w # 前进一步
j += q
while -1<i<len(board) and -1<j<len(board[0]): # 设置不要超出棋盘范围,可以直接写8
if board[i][j] == 'B': # 遇到 象,就不能继续往前走了,所以这条路不行
return 0
elif board[i][j] == 'p': # 遇到 车,吃掉,返回1,表示吃到一个🚗
return 1
else: # 遇到空格,继续往前一步
i += w
j += q
return 0 # 走到了棋盘尽头,啥也没遇到,返回0
res = 0
[i,j] = findR(board) # i和j 就是R的位置
for w,q in [[0,1],[0,-1],[1,0],[-1,0]]: # 有 上下左右 4个方向可以走
res += dfs(i,j,board,w,q) # 分4个方向 分别调用dfs
return res
总结:DFS和BFS一直是我的不太会的点,每次遇到都觉得很难,脑袋一团浆糊,但是总要迎难而上的嘛,慢慢多练也就会了。之前写了一题 leetcode 22.括号生成,也是用到了DFS,之后也会记录到博客里。经过这两题,已经对DFS没这么抗拒了,💪!
DFS总是作为一个子函数来调用。
如果要求记录下路径的话,总是用一个全局变量来记录。这个变量也作为参数输入到DFS函数中,这样就可以不断传递到下一级中,记录下每一级节点的结果,最后连成路径。(参考leetcode 22.括号生成)