3918 - Back Cp

From Bitnami MediaWiki

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>