题目描述
给定一个二维的矩阵,包含 'X'
和 'O'
(字母 O)。
找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
示例:
1 | X X X X |
运行你的函数后,矩阵变为:
1 | X X X X |
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O'
都不会被填充为 'X'
。 任何不在边界上,或不与边界上的 'O'
相连的 'O'
最终都会被填充为 'X'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
解题思路
第一眼看到这个题目就觉得是对图的搜索遍历,一定是需要使用堆栈或者是队列的。
然后分析本题,首先所有在边界上的 O
是不需要被替换的,我们需要找的是非边界上被包围的 O
,其实也就是把能通过边界上的 O
到达的节点找到即可。
这样稍微转换一下就想明白了,就是按照边界上的 O
进行广度优先搜索就可以。
第一步:
初始化,使用一个队列 Q
来保存边界上的 O
,并将其标记出来。
第二步:
队列 Q
取出头部元素,进行广度优先搜索(其实就是上下左右四个方向,判断相应的元素即可)。将搜到的元素进行标记,并将其加入队列中。
第三步:
继续,如果队列 Q
不为空,继续取其头元素,重复执行第二步。
以下是图示:
代码实现
1 | def solve(self, board): |