3918 - Back Cp

From Bitnami MediaWiki

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>