Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
0624 - Sah1
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
== Cerința == Alex dorește să își învețe fratele să joace șah. După ce i-a explicat regulile, Alex vrea să vadă dacă fratele lui a înțeles, aşa că îi dă un mic test. Având o tablă de șah de N linii şi N coloane, Alex pune pe ea M ture (tura atacă doar pe coloana și linia pe care se află) și un rege. Apoi îi cere fratelui său să îi spună de câte ture este atacat regele în acel moment și pe câte căsuțe de pe tablă poate fi pus regele, astfel încât să nu se afle în șah. În figura de mai jos avem trei ture şi un rege. Regele nu este atacat de nicio tură, fiindcă nu se află pe aceeaşi linie sau aceeaşi coloană cu niciuna dintre ele. Cunoscând dimensiunea N a tablei de șah, poziția regelui de pe tablă, numărul M de ture și poziția fiecărei ture de pe tablă, se cere: a)să se afișeze numărul de ture care atacă regele în acel moment; b)numărul de poziții în care regele poate fi pus, astfel încât să nu fie atacat de vreo tură. == Date de intrare == Fişierul de intrare sah1.in conţine pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p poate avea doar valoarea 1 sau valoarea 2. Pe a doua linie se află două numere naturale N și M, cu semnificația din enunț, pe linia a treia se află două numere naturale reprezentând poziția regelui pe tablă, iar pe fiecare dintre următoarele M linii se află câte două numere naturale reprezentând linia respectiv coloana unei ture. == Date de ieșire == Dacă valoarea lui p este 1, se va rezolva numai punctul a) din cerință. În acest caz, în fişierul de ieşire sah1.out se va scrie un număr natural reprezentând numărul de ture ce atacă regele. Dacă valoarea lui p este 2, se va rezolva numai punctul b) din cerință. În acest caz, în fișierul de ieșire sah1.out se va scrie pe prima linie un număr natural Q, reprezentând numărul de poziții pe care poate fi pus regele astfel încât să nu fie atacat de vreo tură. == Restricții și precizări == *2 ≤ N ≤ 10 000 *0 ≤ M ≤ min(2 000, N2-1) *Tabla de șah are liniile și coloanele numerotate de la 1 la N. *Regele poate fi pus pe orice căsuță de pe tablă care nu este ocupată de o tură sau care nu este atacată de vreo tură. == Exemplu 1 == ;Intrare 1<br> 4 3<br> 3 1<br> 1 2<br> 2 3<br> 4 3 ;Iesire 0 == Rezolvare == <syntaxhighlight lang="python" line> def solve_p1(N, king_pos, rooks): king_row, king_col = king_pos attacks = 0 for rook_row, rook_col in rooks: if rook_row == king_row or rook_col == king_col: attacks += 1 return attacks def solve_p2(N, king_pos, rooks): king_row, king_col = king_pos safe_positions = 0 for row in range(1, N + 1): for col in range(1, N + 1): if row == king_row and col == king_col: continue safe = True for rook_row, rook_col in rooks: if row == rook_row or col == rook_col: safe = False break if safe: safe_positions += 1 return safe_positions def main(): with open('sah1.in', 'r') as f: data = f.read().splitlines() p = int(data[0].strip()) N, M = map(int, data[1].strip().split()) king_pos = tuple(map(int, data[2].strip().split())) rooks = [tuple(map(int, line.strip().split())) for line in data[3:3 + M]] # Restricții assert 2 <= N <= 10000, "N trebuie să fie între 2 și 10000" assert 0 <= M <= min(2000, N**2), "M trebuie să fie între 0 și min(2000, N**2)" assert 1 <= king_pos[0] <= N and 1 <= king_pos[1] <= N, "Poziția regelui trebuie să fie validă" for rook in rooks: assert 1 <= rook[0] <= N and 1 <= rook[1] <= N, "Pozițiile turelor trebuie să fie valide" if p == 1: # Rezolvăm punctul a) result = solve_p1(N, king_pos, rooks) with open('sah1.out', 'w') as f: f.write(f"{result}\n") elif p == 2: # Rezolvăm punctul b) result = solve_p2(N, king_pos, rooks) with open('sah1.out', 'w') as f: f.write(f"{result}\n") if __name__ == "__main__": main() </syntaxhighlight>
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width