#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# author: bt3gl

'''
You are given an m x n grid rooms initialized with these three possible values.

* -1 A wall or an obstacle.
* 0 A gate.
* INF Infinity means an empty room (2^31 - 1 = 2147483647 to represent INF)

Fill each empty room with the distance to its nearest gate. 
If it is impossible to reach a gate, it should be filled with INF.
'''

def matrix_bfs(rooms: list[list[int]]) -> None:
        
        m = len(rooms)
        if m == 0:
           return rooms
        n = len(rooms[0])
        
        GATE = 0
        EMPTY = 2147483647
        DIRECTIONS = ((1, 0), (-1, 0), (0, 1), (0, -1))

        q = collections.deque()

        for i in range(m):
            for j in range(n):
                
                if rooms[i][j] == GATE:
                    q.append((i, j))

        while q:

            row, col = q.popleft()

            for (x, y) in DIRECTIONS:

                r = row + x
                c = col + y

                if (r < 0) or (c < 0) or (r >= m) or (c >= n) or rooms[r][c] != EMPTY:
                    continue

                rooms[r][c] = rooms[row][col] + 1
                q.append((r, c))