Problem Link

Description


You are given a non-negative integer n representing a 2n x 2n grid. You must fill the grid with integers from 0 to 22n - 1 to make it special. A grid is special if it satisfies all the following conditions:

  • All numbers in the top-right quadrant are smaller than those in the bottom-right quadrant.
  • All numbers in the bottom-right quadrant are smaller than those in the bottom-left quadrant.
  • All numbers in the bottom-left quadrant are smaller than those in the top-left quadrant.
  • Each of its quadrants is also a special grid.

Return the special 2n x 2n grid.

Note: Any 1x1 grid is special.

Β 

Example 1:

Input: n = 0

Output: [[0]]

Explanation:

The only number that can be placed is 0, and there is only one possible position in the grid.

Example 2:

Input: n = 1

Output: [[3,0],[2,1]]

Explanation:

The numbers in each quadrant are:

  • Top-right: 0
  • Bottom-right: 1
  • Bottom-left: 2
  • Top-left: 3

Since 0 < 1 < 2 < 3, this satisfies the given constraints.

Example 3:

Input: n = 2

Output: [[15,12,3,0],[14,13,2,1],[11,8,7,4],[10,9,6,5]]

Explanation:

The numbers in each quadrant are:

  • Top-right: 3, 0, 2, 1
  • Bottom-right: 7, 4, 6, 5
  • Bottom-left: 11, 8, 10, 9
  • Top-left: 15, 12, 14, 13
  • max(3, 0, 2, 1) < min(7, 4, 6, 5)
  • max(7, 4, 6, 5) < min(11, 8, 10, 9)
  • max(11, 8, 10, 9) < min(15, 12, 14, 13)

This satisfies the first three requirements. Additionally, each quadrant is also a special grid. Thus, this is a special grid.

Β 

Constraints:

  • 0 <= n <= 10

Solution


Python3

class Solution:
    def specialGrid(self, n: int) -> List[List[int]]:
        if n == 0: return [[0]]
            
        rows = cols = 2 ** n
        grid = [[0] * cols for _ in range(rows)]
        curr = 0
 
        def solve(rowStart, rowEnd, colStart, colEnd):
            sz = rowEnd - rowStart
            if sz == 1:
                nonlocal curr
                grid[rowStart][colStart] = curr
                curr += 1
                return 
 
            rowMid = (rowStart + rowEnd) // 2
            colMid = (colStart + colEnd) // 2
 
            solve(rowStart, rowMid, colMid, colEnd) # top-right
            solve(rowMid, rowEnd, colMid, colEnd) # bottom-right
            solve(rowMid, rowEnd, colStart, colMid) # bottom-left
            solve(rowStart, rowMid, colStart, colMid) # top-left
 
        solve(0, rows, 0, cols)
        return grid