遇到一道非常巧妙的题解 做一下记录
原题:leetcode 959
在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。
(请注意,反斜杠字符是转义的,因此 \ 用 "\\" 表示。)。
返回区域的数目。
示例 1:
输入:
[
" /",
"/ "
]
输出:2
解释:2x2 网格如下:
示例 2:
输入:
[
" /",
" "
]
输出:1
解释:2x2 网格如下:
示例 3:
输入:
[
"\\/",
"/\\"
]
输出:4
解释:(回想一下,因为 \ 字符是转义的,所以 "\\/" 表示 \/,而 "/\\" 表示 /\。)
2x2 网格如下:
示例 4:
输入:
[
"/\\",
"\\/"
]
输出:5
解释:(回想一下,因为 \ 字符是转义的,所以 "/\\" 表示 /\,而 "\\/" 表示 \/。)
2x2 网格如下:
示例 5:
输入:
[
"//",
"/ "
]
输出:3
解释:2x2 网格如下:
提示:
1 <= grid.length == grid[0].length <= 30
grid[i][j] 是 '/'、'\'、或 ' '。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/regions-cut-by-slashes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:DFS
class Solution {
public int regionsBySlashes(String[] grid) {
int n = grid.length;
boolean [][] graph = new boolean[n * 3][n * 3];
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
if(grid[i].charAt(j) == '/') {
graph[i * 3][j * 3 + 2] = true;
graph[i * 3 + 1][j * 3 + 1] = true;
graph[i * 3 + 2][j * 3] = true;
} else if(grid[i].charAt(j) == '\\') {
graph[i * 3][j * 3] = true;
graph[i * 3 + 1][j * 3 + 1] = true;
graph[i * 3 + 2][j * 3 + 2] = true;
}
}
}
int res = 0;
for(int i = 0; i < n * 3; ++i) {
for(int j = 0; j < n * 3; ++j) {
if(graph[i][j] == false) {
dfs(graph, i, j);
res++;
}
}
}
return res;
}
private void dfs(boolean [][] graph, int i, int j) {
int n = graph.length;
if(i >= 0 && j >= 0 && i < n && j < n && graph[i][j] == false) {
graph[i][j] = true;
dfs(graph, i, j - 1);
dfs(graph, i, j + 1);
dfs(graph, i - 1, j);
dfs(graph, i + 1, j);
}
}
}