3943 - Cerc5: Difference between revisions
Benzar Ioan (talk | contribs) Pagină nouă: == Cerința == Să se genereze toate permutările circulare ale unui șir de numere naturale, unde permutările circulare sunt permutări în care primul și ultimul element sunt considerate consecutive. == Date de intrare == Programul citește de la tastatură un șir de n numere naturale. == Date de ieșire == Pe ecran se vor afișa toate permutările circulare ale șirului, câte una pe linie. == Restricții și precizări == *1 ⩽ '''n''' ⩽ 10 * Numerele din șir s... |
Benzar Ioan (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
== Cerința == | == Cerința == | ||
Se dă numărul natural n. Determinati o modalitate de așezare a numerelor din mulțimea 1,2,…,n | |||
pe un cerc astfel încât suma a oricare două nume învecinate să nu fie pătrat perfect. | |||
== Date de intrare == | == Date de intrare == | ||
Programul citește de la tastatură | Programul citește de la tastatură numărul n. | ||
== Date de ieșire == | == Date de ieșire == | ||
Programul va afișa pe ecran cele n numere cerute, separate prin câte un spațiu. | |||
== Restricții și precizări == | == Restricții și precizări == | ||
*1 | *1 ≤ n ≤ 35 | ||
* | *dacă există mai multe modalități de aranjare a numerelor astfel încât să fie îndeplinită condiția, se poate afișa oricare; | ||
*dacă nu există nicio modalitate de aranjare se va afișa mesajul nu exista | |||
== Exemplu 1 == | == Exemplu 1 == | ||
;Intrare | ;Intrare | ||
32 | |||
;Iesire | ;Iesire | ||
1 | 1 8 28 21 4 32 17 19 30 6 3 13 12 24 25 11 5 31 18 7 29 20 16 9 27 22 14 2 23 26 10 15 | ||
2 | |||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
def | import math | ||
# Verifică dacă un număr este pătrat perfect | |||
def este_patrat_perfect(x): | |||
return int(math.isqrt(x)) ** 2 == x | |||
def | # Funcție de backtracking pentru a găsi o soluție validă | ||
def backtrack(cerc, vizitat, n): | |||
if len(cerc) == n: | |||
# Verifică dacă primul și ultimul element formează un pătrat perfect | |||
return este_patrat_perfect(cerc[-1] + cerc[0]) | |||
for i in range(1, n + 1): | |||
if | if not vizitat[i]: | ||
if ( | if not cerc or este_patrat_perfect(cerc[-1] + i): | ||
cerc.append(i) | |||
vizitat[i] = True | |||
if backtrack(cerc, vizitat, n): | |||
return True | |||
cerc.pop() | |||
vizitat[i] = False | |||
return False | |||
# Funcție pentru a găsi aranjarea corectă | |||
backtrack( | def gaseste_aranjare(n): | ||
cerc = [] | |||
vizitat = [False] * (n + 1) | |||
if backtrack(cerc, vizitat, n): | |||
return cerc | |||
else: | |||
return "nu exista" | |||
# Funcția principală | |||
def main(): | def main(): | ||
n = int(input().strip()) | |||
rezultat = gaseste_aranjare(n) | |||
if | if isinstance(rezultat, list): | ||
print(" | print(" ".join(map(str, rezultat))) | ||
else: | |||
print(rezultat) | |||
if __name__ == "__main__": | |||
main() | |||
if __name__ == "__main__": | if __name__ == "__main__": |
Latest revision as of 23:52, 2 June 2024
Cerința[edit | edit source]
Se dă numărul natural n. Determinati o modalitate de așezare a numerelor din mulțimea 1,2,…,n
pe un cerc astfel încât suma a oricare două nume învecinate să nu fie pătrat perfect.
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 cele n numere cerute, separate prin câte un spațiu.
Restricții și precizări[edit | edit source]
- 1 ≤ n ≤ 35
- dacă există mai multe modalități de aranjare a numerelor astfel încât să fie îndeplinită condiția, se poate afișa oricare;
- dacă nu există nicio modalitate de aranjare se va afișa mesajul nu exista
Exemplu 1[edit | edit source]
- Intrare
32
- Iesire
1 8 28 21 4 32 17 19 30 6 3 13 12 24 25 11 5 31 18 7 29 20 16 9 27 22 14 2 23 26 10 15
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> import math
- Verifică dacă un număr este pătrat perfect
def este_patrat_perfect(x):
return int(math.isqrt(x)) ** 2 == x
- Funcție de backtracking pentru a găsi o soluție validă
def backtrack(cerc, vizitat, n):
if len(cerc) == n: # Verifică dacă primul și ultimul element formează un pătrat perfect return este_patrat_perfect(cerc[-1] + cerc[0])
for i in range(1, n + 1): if not vizitat[i]: if not cerc or este_patrat_perfect(cerc[-1] + i): cerc.append(i) vizitat[i] = True if backtrack(cerc, vizitat, n): return True cerc.pop() vizitat[i] = False return False
- Funcție pentru a găsi aranjarea corectă
def gaseste_aranjare(n):
cerc = [] vizitat = [False] * (n + 1) if backtrack(cerc, vizitat, n): return cerc else: return "nu exista"
- Funcția principală
def main():
n = int(input().strip()) rezultat = gaseste_aranjare(n) if isinstance(rezultat, list): print(" ".join(map(str, rezultat))) else: print(rezultat)
if __name__ == "__main__":
main()
if __name__ == "__main__":
main()
</syntaxhighlight>