Regions Cut By Slashes

medium graph dfs matrix

Problem

Given an n×n grid of cells containing '/', '\\', or ' ', return the number of regions formed by the slashes.

Inputgrid = [" /","/ "]
Output2
Expand each cell into a 3×3 pixel block so slashes become walls, then DFS/flood-fill.

def regionsBySlashes(grid):
    n = len(grid)
    g = [[0]*(3*n) for _ in range(3*n)]
    for r in range(n):
        for c in range(n):
            ch = grid[r][c]
            if ch == '/':
                g[3*r][3*c+2] = g[3*r+1][3*c+1] = g[3*r+2][3*c] = 1
            elif ch == '\\':
                g[3*r][3*c] = g[3*r+1][3*c+1] = g[3*r+2][3*c+2] = 1
    seen = [[False]*(3*n) for _ in range(3*n)]
    def dfs(r, c):
        if r < 0 or r >= 3*n or c < 0 or c >= 3*n or seen[r][c] or g[r][c]: return
        seen[r][c] = True
        dfs(r+1,c); dfs(r-1,c); dfs(r,c+1); dfs(r,c-1)
    count = 0
    for r in range(3*n):
        for c in range(3*n):
            if not seen[r][c] and not g[r][c]:
                dfs(r, c); count += 1
    return count
function regionsBySlashes(grid) {
  const n = grid.length;
  const g = Array.from({ length: 3 * n }, () => new Array(3 * n).fill(0));
  for (let r = 0; r < n; r++) for (let c = 0; c < n; c++) {
    const ch = grid[r][c];
    if (ch === '/') { g[3*r][3*c+2] = g[3*r+1][3*c+1] = g[3*r+2][3*c] = 1; }
    else if (ch === '\\') { g[3*r][3*c] = g[3*r+1][3*c+1] = g[3*r+2][3*c+2] = 1; }
  }
  const seen = Array.from({ length: 3 * n }, () => new Array(3 * n).fill(false));
  function dfs(r, c) {
    if (r < 0 || r >= 3 * n || c < 0 || c >= 3 * n || seen[r][c] || g[r][c]) return;
    seen[r][c] = true;
    dfs(r+1,c); dfs(r-1,c); dfs(r,c+1); dfs(r,c-1);
  }
  let count = 0;
  for (let r = 0; r < 3 * n; r++) for (let c = 0; c < 3 * n; c++) {
    if (!seen[r][c] && !g[r][c]) { dfs(r, c); count++; }
  }
  return count;
}
class Solution {
    int n; int[][] g; boolean[][] seen;
    public int regionsBySlashes(String[] grid) {
        n = grid.length;
        g = new int[3 * n][3 * n];
        for (int r = 0; r < n; r++) for (int c = 0; c < n; c++) {
            char ch = grid[r].charAt(c);
            if (ch == '/') { g[3*r][3*c+2] = g[3*r+1][3*c+1] = g[3*r+2][3*c] = 1; }
            else if (ch == '\\') { g[3*r][3*c] = g[3*r+1][3*c+1] = g[3*r+2][3*c+2] = 1; }
        }
        seen = new boolean[3 * n][3 * n];
        int count = 0;
        for (int r = 0; r < 3 * n; r++) for (int c = 0; c < 3 * n; c++)
            if (!seen[r][c] && g[r][c] == 0) { dfs(r, c); count++; }
        return count;
    }
    void dfs(int r, int c) {
        if (r < 0 || r >= 3 * n || c < 0 || c >= 3 * n || seen[r][c] || g[r][c] == 1) return;
        seen[r][c] = true;
        dfs(r+1,c); dfs(r-1,c); dfs(r,c+1); dfs(r,c-1);
    }
}
int regionsBySlashes(vector<string>& grid) {
    int n = (int)grid.size();
    vector<vector<int>> g(3 * n, vector<int>(3 * n, 0));
    for (int r = 0; r < n; r++) for (int c = 0; c < n; c++) {
        char ch = grid[r][c];
        if (ch == '/') g[3*r][3*c+2] = g[3*r+1][3*c+1] = g[3*r+2][3*c] = 1;
        else if (ch == '\\') g[3*r][3*c] = g[3*r+1][3*c+1] = g[3*r+2][3*c+2] = 1;
    }
    vector<vector<bool>> seen(3 * n, vector<bool>(3 * n, false));
    function<void(int, int)> dfs = [&](int r, int c) {
        if (r < 0 || r >= 3 * n || c < 0 || c >= 3 * n || seen[r][c] || g[r][c]) return;
        seen[r][c] = true;
        dfs(r+1,c); dfs(r-1,c); dfs(r,c+1); dfs(r,c-1);
    };
    int count = 0;
    for (int r = 0; r < 3 * n; r++) for (int c = 0; c < 3 * n; c++)
        if (!seen[r][c] && !g[r][c]) { dfs(r, c); count++; }
    return count;
}
Time: O(n²) Space: O(n²)