0726 - Acoperire 1

De la Universitas MediaWiki

Dintr-o suprafaţă pătrată cu latura de N unităţi care este formată din N*N pătrăţele cu latura de o unitate se decupează cele 4 pătrăţele din colţuri.

Cerința

Determinaţi o modalitate de a acoperi suprafaţa în întregime cu piese de arie 4 unităţi care au forma următoare:

Piesele pot fi si rotite sau întoarse putând astfel să folosim toate cele 8 moduri de a le aşeza.

Date de intrare

Fișierul de intrare acoperire1.in conține pe prima linie un număr natural N, cu semnificaţia din enunţ.

Date de ieșire

Fișierul de ieșire acoperire1.out va conține valoarea -1 pe prima linie dacă problema nu are soluţie, iar în caz contrar va avea următoarea structură: N linii cu câte N valori fiecare reprezentând codificarea suprafeţei. Numerele de pe aceeaşi linie sunt separate prin câte un spaţiu. Poziţiile ocupate de prima piesă aşezată se vor codifica cu 1, poziţiile ocupate de a doua piesă aşezată se vor codifica cu 2 etc. Corespunzător colţurilor lipsă se va scrie valoarea 0.

Restricții și precizări

  • 6 ≤ n ≤ 200
  • Piesele trebuie să fie complet în interiorul zonei;
  • Zona trebuie acoperită integral;
  • Două piese nu se pot suprapune complet sau parţial;

Exemplu:

acoperire1.in

6

acoperire1.out

0 7 2 2 2 0 
3 7 2 4 4 4 
3 7 7 4 5 5 
3 3 6 1 1 5 
6 6 6 8 1 5 
0 8 8 8 1 0
def place_l_tiles(board, n, top_left_row, top_left_col):
    # n - dimension of the current board (n x n)
    if n == 2:
        # Base case: only one tile can fit, as 4 cells are considered and one corner is missing
        for i in range(2):
            for j in range(2):
                if board[top_left_row + i][top_left_col + j] == 0:
                    board[top_left_row + i][top_left_col + j] = 1
        return
    
    half = n // 2
    # Find the center tile to place the L-shaped tromino around
    # (middle of the top-left, top-right, bottom-left, bottom-right quarters)
    center_r, center_c = top_left_row + half - 1, top_left_col + half - 1

    # Determine which quadrant is missing the corner cell
    if board[top_left_row][top_left_col] == -1:
        missing_quad = 0
    elif board[top_left_row][top_left_col + n - 1] == -1:
        missing_quad = 1
    elif board[top_left_row + n - 1][top_left_col] == -1:
        missing_quad = 2
    elif board[top_left_row + n - 1][top_left_col + n - 1] == -1:
        missing_quad = 3
    
    # Fill the center of the current board with a L-shaped tromino
    tiles = [(center_r, center_c), (center_r, center_c + 1), (center_r + 1, center_c), (center_r + 1, center_c + 1)]
    # We have four quadrants (0: top-left, 1: top-right, 2: bottom-left, 3: bottom-right)
    for idx, (i, j) in enumerate(tiles):
        if idx != missing_quad:
            board[i][j] = 1

    # Recursively fill each of the four quadrants
    # Top-left quadrant
    place_l_tiles(board, half, top_left_row, top_left_col)
    # Top-right quadrant
    place_l_tiles(board, half, top_left_row, top_left_col + half)
    # Bottom-left quadrant
    place_l_tiles(board, half, top_left_row + half, top_left_col)
    # Bottom-right quadrant
    place_l_tiles(board, half, top_left_row + half, top_left_col + half)

# Initialize the board
N = 4 # Example value, should be a power of 2
board = [[0 for _ in range(N)] for _ in range(N)]

# Remove corners
board[0][0] = -1
board[0][N-1] = -1
board[N-1][0] = -1
board[N-1][N-1] = -1

# Place L-shaped tiles starting from the top-left corner of the board
place_l_tiles(board, N, 0, 0)

# Print the board
for row in board:
    print(' '.join(str(cell) for cell in row))