LeetCode(959)由斜杠划分区域
Description:
在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。
(请注意,反斜杠字符是转义的,因此 \ 用 “\” 表示。)。
返回区域的数目。
示例1:
输入: [ " /", "/ " ] 输出:2
示例2:
输入: [ " /", " " ] 输出:1
示例3:
输入: [ "\\/", "/\\" ] 输出:4
思路:
无非两种:
- DFS
- 并查集
代码:
- DFS:
char grid_ex[100][100];
int SIZE;
void expand(char **grid, int gridSize)
{
for(int i=0;i<gridSize;i++)
{
for(int j=0;j<gridSize;j++)
{
if(grid[i][j]==' ')
{
grid_ex[3*i][3*j]=grid_ex[3*i][3*j+1]=grid_ex[3*i][3*j+2]=\
grid_ex[3*i+1][3*j]=grid_ex[3*i+1][3*j+1]=grid_ex[3*i+1][3*j+2]=\
grid_ex[3*i+2][3*j]=grid_ex[3*i+2][3*j+1]=grid_ex[3*i+2][3*j+2]=' ';
}
else if(grid[i][j]=='/')
{
grid_ex[3*i][3*j]=grid_ex[3*i][3*j+1]=grid_ex[3*i+1][3*j]=\
grid_ex[3*i+1][3*j+2]=grid_ex[3*i+2][3*j+1]=grid_ex[3*i+2][3*j+2]=' ';
grid_ex[3*i][3*j+2]=grid_ex[3*i+1][3*j+1]=grid_ex[3*i+2][3*j]='*';
}
else if(grid[i][j]=='\\')
{
grid_ex[3*i][3*j+2]=grid_ex[3*i+1][3*j]=grid_ex[3*i+1][3*j+2]=\
grid_ex[3*i+2][3*j]=grid_ex[3*i][3*j+1]=grid_ex[3*i+2][3*j+1]=' ';
grid_ex[3*i][3*j]=grid_ex[3*i+1][3*j+1]=grid_ex[3*i+2][3*j+2]='*';
}
}
}
}
void dfs(int i, int j)//size = gridSize * 3
{
grid_ex[i][j]='*';
if(i-1>=0&&grid_ex[i-1][j]==' ')dfs(i-1,j);
if(i+1<SIZE&&grid_ex[i+1][j]==' ')dfs(i+1,j);
if(j-1>=0&&grid_ex[i][j-1]==' ')dfs(i,j-1);
if(j+1<SIZE&&grid_ex[i][j+1]==' ')dfs(i,j+1);
return;
}
int regionsBySlashes(char ** grid, int gridSize){
SIZE = 3 * gridSize;
expand(grid, gridSize);
int count=0;
for(int i=0;i<SIZE;i++)
{
for(int j=0;j<SIZE;j++)
{
if(grid_ex[i][j]==' ')
{
dfs(i, j);
count++;
}
}
}
return count;
}
- 并查集就留给读者自己思考啦。