问题描述 :
在由 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 网格如下:
可使用如下main函数:
int main(){
int n;
vector<string> grid;
string line;
cin>>n;
cin.get();
for(int i=0; i<n; i++){
getline(cin,line);
grid.push_back(line);
}
int res=regionsBySlashes(grid) ;
cout<<res;
}
输入说明 :
首先输入网格的大小N,1 <= N <= 30
然后输入N行,每行N个字符,每个字符是 ‘/’、’’、或 ’ '。
输出说明 :
输出结果
输入范例 :
2
/
/
输出范例 :
5
//用3*3的大网格代替每一个1*1的小网格
void dfs(int x,int y,vector<vector<bool>> &vis,vector<vector<int>> &new_grid){
if(x<0||x>=new_grid.size()||y<0||y>=new_grid[0].size()||new_grid[x][y]==1||vis[x][y]==true){
return ;
}
vis[x][y]=true;
dfs(x+1,y,vis,new_grid);
dfs(x,y+1,vis,new_grid);
dfs(x-1,y,vis,new_grid);
dfs(x,y-1,vis,new_grid);
}
int regionsBySlashes(vector<string> &grid){
int n=grid.size();
vector<vector<bool>> vis(3*n,vector<bool> (3*n,false));
vector<vector<int>> new_grid(3*n,vector<int>(3*n,0));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(grid[i][j]=='/'){
new_grid[3*i][3*j+2] = 1;
new_grid[3*i+1][3*j+1] = 1;
new_grid[3*i+2][3*j] = 1;
}else if(grid[i][j]=='\\'){
new_grid[3*i][3*j] = 1;
new_grid[3*i+1][3*j+1] = 1;
new_grid[3*i+2][3*j+2] = 1;
}
}
}
int count=0;
for(int i=0;i<3*n;i++){
for(int j=0;j<3*n;j++){
if(!vis[i][j]&&new_grid[i][j]==0){
dfs(i,j,vis,new_grid);
count++;
}
}
}
return count;
}