3918 - Back Cp
Cerința
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
Programul citește de la tastatură numerele n
și m
, separate prin spații.
Date de ieșire
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
0 ≤ n ≤ 13
,0 ≤ m ≤ 13
Exemplul 1:
Intrare
3 2
Ieșire
CCCPP CCPPC CPPCC PCCCP PPCCC
Exemplul 2:
Intrare
14 14
Ieșire
Datele nu corespund restrictiilor impuse
Rezolvare
<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>