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 și2n
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 .
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!