题目描述
给定一个二维的矩阵,包含 '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): |