在由 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]
是'/'
、'\'
、或' '
。
思路:这实际是一个岛屿个数的问题。将输入的string表达式所代表的网格扩大三倍,如下图。其中右下图为扩大后的图,黑色部分表示原始的/
或者\
。对扩大后的图进行dfs得到最终的结果。
class Solution {
public:
void dfs(vector<vector<int> > &nums, int i, int j){
if(i>=0 && j>=0 && i<nums.size() && j<nums.size() && !nums[i][j]){
nums[i][j]=1;
dfs(nums, i-1, j);
dfs(nums, i, j-1);
dfs(nums, i, j+1);
dfs(nums, i+1, j);
}
}
int regionsBySlashes(vector<string>& grid) {
int n=grid.size(), re=0;
vector<vector<int> >nums(3*n, vector<int>(3*n));
//将原始网格扩大三倍
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j){
if(grid[i][j]=='/'){
nums[i*3][j*3+2]=nums[i*3+1][j*3+1]=nums[i*3+2][j*3]=1;
}
if(grid[i][j]=='\\'){
nums[i*3][j*3]=nums[i*3+1][j*3+1]=nums[i*3+2][j*3+2]=1;
}
}
}
for(int i=0; i<3*n; ++i){
for(int j=0; j<3*n; ++j){
if(!nums[i][j]){
dfs(nums, i, j);//只要遇到0的网格,把它和它周围所有相邻的0都置为1,并且得到一个区域。
re++;
}
}
}
return re;
}
};