0602 - Regine

De la Universitas MediaWiki

Cerința

Pe o tablă de șah de dimensiune n se află m regine. O regină atacă o altă regină dacă cele două se află pe aceeași linie, coloană sau diagonală și între ele nu se află alte regine. Determinați numărul maxim p de regine care sunt atacate de o aceeași regină și numărul q de regine care atacă p alte regine.

Date de intrare

Fișierul de intrare reginein.txt conține pe prima linie numerele n m; următoarele m linii conțin perechi i j reprezentând linia și coloana unde se află poziționată o regină.

Date de ieșire

Fișierul de ieșire regine.out va conține pe prima linie numerele p q, separate prin exact un spațiu, reprezentând valorile de mai sus.

Restricții și precizări

  • 1 ⩽ n ⩽ 100
  • 1 ⩽ m ⩽ 500
  • 1 ⩽ i,j ⩽ n
  • pe tablă nu există două regine suprapuse

Exemplu 1

reginein.txt
8 9
1 7
2 2
2 8
4 1
5 2
5 5
5 8
7 2
7 7
regineout.txt
5 3


Exemplu 2

Intrare
0 0
0 0
Ieșire
Nu au fost respectate cerintele impuse


Rezolvare

#0602 - Regine
def is_valid_input(n, m, positions):
    if not (1 <= n <= 100 and 1 <= m <= 500):
        return False

    seen_positions = set()

    for i, j in positions:
        if not (1 <= i <= n and 1 <= j <= n) or (i, j) in seen_positions:
            return False
        seen_positions.add((i, j))

    return True

def count_attacked_queens(n, positions):
    attacked_by = [0] * len(positions)

    for i, (x, y) in enumerate(positions):
        for j, (u, v) in enumerate(positions):
            if i != j and (x == u or y == v or abs(x - u) == abs(y - v)):
                attacked_by[i] += 1

    max_attacked = max(attacked_by)
    num_queens_attacking_max = attacked_by.count(max_attacked)

    return max_attacked, num_queens_attacking_max

if __name__ == "__main__":
    with open("reginein.txt", "r") as file:
        n, m = map(int, file.readline().split())
        positions = [tuple(map(int, line.split())) for line in file]

    if is_valid_input(n, m, positions):
        p, q = count_attacked_queens(n, positions)
        with open("regineout.txt", "w") as output_file:
            output_file.write(f"{p} {q}\n")
    else:
        print("Nu au fost respectate cerintele impuse.")