3918 - Back Cp
Cerința[edit | edit source]
Se citesc două numere naturale n
și m
. Afișați în ordine lexicografică toate cuvintele care sunt formate din n
litere C
și m
litere P
cu proprietatea că nu există nicio literă P
cuprinsă între două litere C
.
Date de intrare[edit | edit source]
Programul citește de la tastatură numerele n
și m
, separate prin spații.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran pe linii separate cuvintele cerute.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".
Restricții și precizări[edit | edit source]
0 ≤ n ≤ 13
,0 ≤ m ≤ 13
Exemplul 1:[edit | edit source]
Intrare
3 2
Ieșire
CCCPP CCPPC CPPCC PCCCP PPCCC
Exemplul 2:[edit | edit source]
Intrare
14 14
Ieșire
Datele nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def check_restrictions(n, m):
if 0 <= n <= 13 and 0 <= m <= 13: return True else: print("Datele nu corespund restrictiilor impuse") return False
def afisare(X, n, m):
result = "" for i in range(1, n + m + 1): if X[i] == 0: result += 'C' else: result += 'P' print(result)
def ok(X, k, n, m):
s = sum(X[1:k+1]) if s > m or k - s > n: return False if k > 2 and X[k-2] == 0 and X[k-1] == 1 and X[k] == 0: return False return True
def back(X, k, n, m):
for i in range(2): X[k] = i if ok(X, k, n, m): if k == n + m: afisare(X, n, m) else: back(X, k + 1, n, m)
def main():
n, m = map(int, input().split())
if not check_restrictions(n, m): return
X = [0] * (n + m + 1) back(X, 1, n, m)
if __name__ == "__main__":
main()
</syntaxhighlight>