Rezolvare completă PbInfo #617 Piese

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.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Piese:

#include <iostream>
#include <cstdlib>
using namespace std;

int n, m , a[1025][1025];

int main()
{
    cin >> m;
    n = 1 ;
    for(int i = 1 ; i <= m  ; i ++)
        n *= 2;
    if(m == 1)
    {
        a[1][1] = a[1][2] = a[2][1] = 1;
    }
    else
        if(m == 2)
        {
            a[1][1] = a[1][2] = a[2][1] = 1;
            a[1][3] = a[1][4] = a[2][4] = 2;
            a[3][1] = a[4][1] = a[4][2] = 3;
            a[3][4] = a[4][3] = a[4][4] = 4;
            a[2][2] = a[2][3] = a[3][2] = 5;
        }
        else
        {
            int p = 0;
            int i , j;
            if(m % 2 == 1)
            {
                //ramane jos o singura banda
                for(i = 1 ; i + 3 <= n ; i += 3)
                    for(j = 1 ; j <= n ; j += 2)
                    {
                        p ++;
                        a[i][j] = a[i][j+1] = a[i+1][j] = p;
                        p++;
                        a[i+1][j+1] = a[i+2][j] = a[i+2][j+1] = p;
                    }
                i = n -1;
                for(j = 1; j <= n - 2; j += 3)
                {
                    p ++;
                    a[i][j] = a[i][j+1] = a[i+1][j] = p;
                    p++;
                    a[i+1][j+1] = a[i+1][j+2] = a[i][j+2] = p;
                }
                i = n - 1, j = n - 1;
                p ++;
                a[i][j] = a[i][j+1] = a[i+1][j] = p;
            }
            else
            {
                //ramane jos o doua benzi
                for(i = 1 ; i <= n - 4; i += 3)
                    for(j = 1 ; j <= n ; j += 2)
                    {
                        p ++;
                        a[i][j] = a[i][j+1] = a[i+1][j] = p;
                        p++;
                        a[i+1][j+1] = a[i+2][j] = a[i+2][j+1] = p;
                    }
                i = n - 3;
                for(j = 1; j <= n - 4; j += 3)
                {
                    p ++;
                    a[i][j] = a[i][j+1] = a[i+1][j] = p;
                    p++;
                    a[i+1][j+1] = a[i+1][j+2] = a[i][j+2] = p;
                }
                i = n - 1;
                for(j = 1; j <= n - 4; j += 3)
                {
                    p ++;
                    a[i][j] = a[i][j+1] = a[i+1][j] = p;
                    p++;
                    a[i+1][j+1] = a[i+1][j+2] = a[i][j+2] = p;
                }
                i = n - 3, j = n - 3;
                p ++;
                a[i][j] = a[i][j+1] = a[i+1][j] = p;
                p ++;
                a[i][j+2] = a[i][j+3] = a[i+1][j+3] = p;
                p ++;
                a[i+2][j] = a[i+3][j] = a[i+3][j+1] = p;
                p ++;
                a[i+2][j+3] = a[i+3][j+2] = a[i+3][j+3] = p;
                p ++;
                a[i+1][j+1] = a[i+1][j+2] = a[i+2][j+1] = p;
            }
        }
    for(int i =1; i <= n ; ++i)
    {
        for(int  j = 1 ; j <= n ; j ++)
            cout << a[i][j] << " ";
        cout << "
";
    }
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #617 Piese

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #617 Piese de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!