Surrounded Regions[hard]

Surrounded Regions[hard]_第1张图片

这道题我本来以为很容易就能用DFS做掉的,但是做了一半发现很难写这个stop case. 到底什么算是region被包起来? 上下左右都是X 那当然是,但是如果是一连串的O外部被X包住,每个O的格子周围不可能有4个X。 这个时候要怎么做判断?

我大概写了一下 但是没写出来。。。

Surrounded Regions[hard]_第2张图片


看了一下discussion,发现好像BFS才是这道题比较好的解法。好不容易找到一个DFS的思路看看我是missng在哪。。


Surrounded Regions[hard]_第3张图片
Surrounded Regions[hard]_第4张图片

首先答案先check了一下边界问题,因为top & bot row, left& right col 都是没有X能够围住的。所以那里如果出现了O,是不能被变成X的。答案大神发现只要O的region是链接到边界上的O的,都是不能被包住的。【这个observation太关键】。所以他先从边界出发,把所有边界O链接的O暂时变成Y这个字符。(保证之后不受影响,然后之后再改回来)

之后遍历整个array, 把所有O的地方变成X,因为这些没有链接到边界上,都是被围住的。最后再改Y回O。

Surrounded Regions[hard]_第5张图片


BFS的解法:

”dfs, bfs, union-find都可以做, 基本思路是

从在四个边的各个'O'开始搜索, 连在一起的'O'就是不能被包围的, 其余的点都应该设为'X'.

如果选择bfs, 可以把所有边上的所有'O'一起入队, 同时进行bfs“

感觉都是发现了边界问题才知道怎么做。。

先把边界上的O点放入queue里。然后set it = "V"

他这里对边界的处理非常的小心。第二次的loop,他就从i=1开始,到height-2就停了。为了避免重复count。

然后进入BFS,按最早进Queue的先pop处理。 每次pop出一个node,就把上下左右是O的全部先变成‘v’, 然后把该位置放入queue里。等一会再pop出来 重复这个操作。这一步是为了把所有连接边界的为O的地方全部暂时变成'V', 然后保证之后的操作不影响他们。

BFS 做好以后,把board里所有还是"O"的地方变成“X”。

Surrounded Regions[hard]_第6张图片

你可能感兴趣的:(Surrounded Regions[hard])