# PBinfo #617 – piese – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

Cerința
Considerăm o tablă de șah pătratică formată din 2n linii și 2n coloane, unde n este un număr natural nenul, formată din 2n*2n zone. Aceasta poate fi acoperită, cu excepția unei singure zone, cu piese în formă de L, fiecare piesă acoperind 3 zone. De exemplu, pentru n=2, o acoperire este următoarea, în care zona neagră este cea neacoperită de piese:



Pentru n dat, determinați o modalitate de acoperire a tablei cu piese, astfel încât să nu se suprapună piesele și să rămână o singură zonă neacoperită.

Date de intrare
Programul citește de la tastatură numărul n

Date de ieșire
Programul va afișa pe ecran o matrice care reprezintă tabla, cu următoarele proprietăți:


matricea va avea 2n linii și 2n coloane
matricea va conține un singur element 0, reprezentând zona neacoperită
fiecare piesă va fi marcată pe tablă prin trei elemente cu aceeași valoare, dispuse în formă de L
oricare două piese de pe tablă vor fi marcate cu valori diferite
piesele vor fi marcate cu valori naturale consecutive, începând cu 1
fiecare linie a matricei va fi afișată pe câte o linie a ecranului, elementele de pe o linie fiind separate prin câte un spațiu

Restricții și precizări

1 ≤ n ≤ 10
orice aranjare corectă a pieselor se ia în considerare

Exemplu:
Intrare

2
Ieșire

2 2 5 5
2 1 1 5
3 0 1 4
3 3 4 4
Explicație
Exemplul corespunde desenului de mai sus.

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
int n, m, mat[1025][1025];
int main()
{
    cin >> m;
    n = 1 ;
    for (int i = 1 ; i <= m  ; i ++)
        n = n * 2;
    if (m == 1) {
        mat[1][1] = mat[1][2] = mat[2][1] = 1;
    } else
        if (m == 2) {
            mat[1][1] = mat[1][2] = mat[2][1] = 1;
            mat[1][3] = mat[1][4] = mat[2][4] = 2;
            mat[3][1] = mat[4][1] = mat[4][2] = 3;
            mat[3][4] = mat[4][3] = mat[4][4] = 4;
            mat[2][2] = mat[2][3] = mat[3][2] = 5;
        }
        else {
            int temp = 0, i, j;
            if (m % 2 == 1) {
                for (i = 1; i + 3 <= n; i = i + 3)
                    for(j = 1; j <= n; j = j + 2) {
                        temp ++;
                        mat[i][j] = mat[i][j+1] = mat[i+1][j] = temp;
                        temp++;
                        mat[i+1][j+1] = mat[i+2][j] = mat[i+2][j+1] = temp;
                    }
                i = n -1;
                for(j = 1; j <= n - 2; j = j + 3) {
                    temp ++;
                    mat[i][j] = mat[i][j+1] = mat[i+1][j] = temp;
                    temp++;
                    mat[i+1][j+1] = mat[i+1][j+2] = mat[i][j+2] = temp;
                } i = n - 1; j = n - 1;
                temp ++;
                mat[i][j] = mat[i][j+1] = mat[i+1][j] = temp;
            } else {
                for (i = 1 ; i <= n - 4; i = i + 3)
                    for (j = 1 ; j <= n ; j = j + 2) {
                        temp ++;
                        mat[i][j] = mat[i][j+1] = mat[i+1][j] = temp;
                        temp++;
                        mat[i+1][j+1] = mat[i+2][j] = mat[i+2][j+1] = temp;
                    }
                i = n - 3;
                for (j = 1; j <= n - 4; j = j + 3) {
                    temp ++;
                    mat[i][j] = mat[i][j+1] = mat[i+1][j] = temp;
                    temp++;
                    mat[i+1][j+1] = mat[i+1][j+2] = mat[i][j+2] = temp;
                } i = n - 1;
                for (j = 1; j <= n - 4; j = j + 3) {
                    temp ++;
                    mat[i][j] = mat[i][j+1] = mat[i+1][j] = temp;
                    temp++;
                    mat[i+1][j+1] = mat[i+1][j+2] = mat[i][j+2] = temp;
                } i = n - 3, j = n - 3;
                temp ++;
                mat[i][j] = mat[i][j+1] = mat[i+1][j] = temp;
                temp ++;
                mat[i][j+2] = mat[i][j+3] = mat[i+1][j+3] = temp;
                temp ++;
                mat[i+2][j] = mat[i+3][j] = mat[i+3][j+1] = temp;
                temp ++;
                mat[i+2][j+3] = mat[i+3][j+2] = mat[i+3][j+3] = temp;
                temp ++;
                mat[i+1][j+1] = mat[i+1][j+2] = mat[i+2][j+1] = temp;
            }
        }
    for (int i =1; i <= n; i++) {
        for (int  j = 1; j <= n; j++)
            cout << mat[i][j] << " ";
        cout << "\n";
    } return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/617)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/617/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-617/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
