1281 - Regine1

From Bitnami MediaWiki

Cerința[edit | edit source]

Se consideră o tablă de șah de dimensiune n. Să se plaseze pe tablă n regine astfel încât să nu existe două regine care să se atace.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran o singură configurație validă a tablei de șah. Ea va fi alcătuită din n linii cu câte n caractere - sau *, separate prin câte un spațiu. Caracterul - reprezintă o poziție liberă de pe tablă, iar caracterul * reprezintă o poziție de pe tablă ocupată de o regină.

Restricții și precizări[edit | edit source]

  • 4 ≤ n ≤ 10;
  • două regine se atacă dacă se află pe aceeași linie, aceeași coloană sau aceeași diagonală;
  • orice configurație validă a tablei este acceptată.

Exemplul 1[edit | edit source]

Intrare

4

Ieșire

- - * - 
* - - - 
- - - * 
- * - - 

Exemplul 2[edit | edit source]

Intrare

1

Consola

Dimensiunea tablei trebuie să fie între 4 ștre 4 și 10).

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verifica_restrictie_n(n):

   # Verifică restricția asupra valorii lui n
   return 4 <= n <= 10

def verifica_restrictii(tabla, linie, coloana, n):

   # Verifică dacă este sigur să plasezi o regină la poziția (linie, coloana)
   # Verifică pe aceeași linie
   if '*' in tabla[linie]:
       return False
   # Verifică pe aceeași coloană
   if '*' in [tabla[i][coloana] for i in range(n)]:
       return False
   # Verifică pe diagonala principală
   if '*' in [tabla[i][i] for i in range(min(linie, coloana) + 1)]:
       return False
   # Verifică pe diagonala secundară
   if '*' in [tabla[i][coloana - (linie - i)] for i in range(min(linie, coloana, n - coloana - 1) + 1)]:
       return False
   return True

def afiseaza_tabla(tabla, n):

   # Afișează configurația tablei de șah
   for i in range(n):
       print(' '.join(tabla[i]))

def rezolva(tabla, linie, n):

   # Verifică dacă am plasat toate reginele
   if linie == n:
       afiseaza_tabla(tabla, n)
       exit()
   # Plasează regina pe fiecare coloană a liniei curente
   for coloana in range(n):
       if verifica_restrictii(tabla, linie, coloana, n):
           tabla[linie][coloana] = '*'
           rezolva(tabla, linie + 1, n)
           tabla[linie][coloana] = '-'
  1. Cerem utilizatorului să introducă dimensiunea tablei de șah

input_n = input("Introduceți dimensiunea tablei de șah (n între 4 și 10): ")

  1. Verificăm restricția asupra valorii lui n

try:

   n = int(input_n)
   if verifica_restrictie_n(n):
       # Inițializăm tabla de șah cu caractere '-'
       tabla = [['-' for _ in range(n)] for _ in range(n)]
       # Apelăm funcția pentru a rezolva problema
       rezolva(tabla, 0, n)
   else:
       print("Dimensiunea tablei trebuie să fie între 4 și 10.")

except ValueError:

   print("Introduceți o valoare validă pentru n.")

</syntaxhighlight>