1281 - Regine1

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerința

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

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

Date de ieșire

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

  • 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

Intrare

4

Ieșire

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

Exemplul 2

Intrare

1

Consola

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

Rezolvare

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] = '-'

# Cerem utilizatorului să introducă dimensiunea tablei de șah
input_n = input("Introduceți dimensiunea tablei de șah (n între 4 și 10): ")

# 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.")