题目描述
在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。(请注意,反斜杠字符是转义的,因此 \ 用 “\“ 表示。)。返回区域的数目。
题目分析
- 该题目用用图来表示的话,一目了然。可是表示成了字符串之后,就感觉有点不知从何处下手。
- 想办法将图形表示转化成直观的数组表示法。
算法
并查集(Union Find)
由于每个小区域只填充’/‘或者’',因此,小区域划分最多有三种情况(编号如上图所示):
- 编号0和编号1在同一个块,编号2和编号3在同一个块。
- 编号0和编号2在同一个块,编号1和编号3在同一个块。
- 编号0, 1, 2, 3都在同一个块。
相邻区域间,他们的编号小区域存在一定会在同一个块的情况。其中:
- 编号0和上一个区域编号3一定在同一个块。
- 编号1和左边区域的编号2一定在同一个块。
- 编号2和右边区域的编号1一定在同一个块。
- 编号3和下边区域的编号0一定在同一个块。
我们开始给每个小区域编一个唯一的块号,通过遍历区域,达到数出全部唯一块的数目。
代码
1 | class Solution { |
深度优先搜索(Depth first Search)
我们很难从原图中,将该图转化成一个用数字表示的数组。但是,当我们将原图表示成一个规模*2的数组时,他将可以表示如下:
1 | 0 1 0 1 |
我们将数字1当做一道墙,数字0当做一个空白块,则没有墙相隔的块,他们属于同一个唯一块。从上数字中,我们可以直观的看出,一共存在3个唯一块。但是这时,属于同一个唯一空白块的小空白块他们可能还不相邻(即在斜对角线上)。我们再把原图表示成一个规模*3数组,表示如下:
1 | 0 0 1 0 0 1 |
这时,可以清楚的看出,一共存在3个唯一空白块,且在同一个唯一空白块的所有小空白块,都是相邻的了。这个时候,我们就可以采用深度优先搜索,从数组的边界开始,遍历存在多少个不相邻的0,即可得到答案。
代码
1 | class Solution { |

