1226 - Nebuni

From Bitnami MediaWiki
Revision as of 04:55, 1 April 2024 by Cristina94 (talk | contribs) (Pagină nouă: ==Enunţ== Pe o tablă de şah cu N linii şi N coloane sunt plasaţi M nebuni. După cum se ştie de la jocul de şah, nebunii atacă doar în diagonală. O poziţie de pe tabla de şah este considerată sigură dacă nu este atacată de niciun nebun aflat pe tablă. ==Cerinţă== Scrieţi un program care să determine numărul de poziţii sigure de pe tabla de şah. ==Date de intrare== Fișierul de intrare nebuni.in conține pe prima linie numerele naturale N M, separate...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunţ[edit | edit source]

Pe o tablă de şah cu N linii şi N coloane sunt plasaţi M nebuni. După cum se ştie de la jocul de şah, nebunii atacă doar în diagonală.

O poziţie de pe tabla de şah este considerată sigură dacă nu este atacată de niciun nebun aflat pe tablă.

Cerinţă[edit | edit source]

Scrieţi un program care să determine numărul de poziţii sigure de pe tabla de şah.

Date de intrare[edit | edit source]

Fișierul de intrare nebuni.in conține pe prima linie numerele naturale N M, separate prin spaţiu, cu semnificaţia din enunţ. Pe următoarele M linii sunt descrise poziţiile (linia şi coloana, separate prin spaţiu) celor M nebuni, câte un nebun pe o linie a fişierului.

Date de ieșire[edit | edit source]

Fișierul de ieșire nebuni.out va conține o singură linie pe care va fi scris un număr natural reprezentând numărul de poziţii sigure de pe tabla de şah.

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

1 ≤ N ≤ 1 000 000 1 ≤ M < 16 500 Liniile şi coloanele sunt numerotate de la 1 la N. Pentru 50% dintre teste N ≤ 300. Pentru 60% dintre teste M ≤ 1000.

Exemplu 1[edit | edit source]

nebuni.in
5 4
2 1
1 3
4 2
5 2
nebuni.out
6

Exemplu 2[edit | edit source]

nebuni.in
10 3
1 1
15 8
5 12
nebuni.out
Date de intrare invalide.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1226 Nebuni

def verificare_date_intrare(N, M, nebuni):

 if not (1 <= N <= 1000000):
   return False
 if not (1 <= M < 16500):
   return False
 for x, y in nebuni:
   if not (1 <= x <= N and 1 <= y <= N):
     return False
 return True

def numar_pozitii_sigure(N, M, nebuni):

 # Inițializăm o matrice pentru tabla de șah și o marcam pe toate pozițiile atacate de nebuni
 tabla = [[False] * N for _ in range(N)]
 for x, y in nebuni:
   for i in range(N):
     for j in range(N):
       if abs(x - i) == abs(y - j):
         tabla[i][j] = True
 # Numărăm pozițiile sigure care nu sunt atacate de niciun nebun
 numar_pozitii_sigure = 0
 for i in range(N):
   for j in range(N):
     if not tabla[i][j]:
       numar_pozitii_sigure += 1
 return numar_pozitii_sigure

def main():

 # Citim datele de intrare
 try:
   with open("nebuni.in", "r") as fin:
     N, M = map(int, fin.readline().split())
     nebuni = [tuple(map(int, line.split())) for line in fin]
 except ValueError:
   # Date invalide
   with open("nebuni.out", "w") as fout:
     fout.write("Date invalide\n")
   return
 # Verificăm datele de intrare
 if not verificare_date_intrare(N, M, nebuni):
   with open("nebuni.out", "w") as fout:
     fout.write("Date de intrare invalide.\n")
   return
 # Determinăm numărul de poziții sigure
 rezultat = numar_pozitii_sigure(N, M, nebuni)
 # Scriem rezultatul în fișierul de ieșire
 with open("nebuni.out", "w") as fout:
   fout.write(str(rezultat) + "\n")

if __name__ == "__main__":

 main()

</syntaxhighlight>