3920 - CainiSiPisici1

From Bitnami MediaWiki

Cerința[edit | edit source]

Într-o curte sunt c câini și p pisici. Să se genereze în ordine lexicografică șirurile formate cu toate animalele, care:

încep cu câine și se termină cu pisică;
nu conțin nicio pisică între doi câini.

Date de intrare[edit | edit source]

Programul citește de la tastatură numerele c p.

Date de ieșire[edit | edit source]

Programul va afișa pe rânduri separate ale ecranului șiruri formate din c caractere 'C' (câine) și p caractere 'P' (pisică), conform enunțului.

Restricții și precizări[edit | edit source]

  • 1 ⩽ c , p ⩽ 10

Exemplul 1[edit | edit source]

Intrare
3 3
Ieșire
CCCPPP
CCPPCP
CPPCCP

Exemplul 2[edit | edit source]

Intrare
0 0
Ieșire
Datele nu corespund restrictiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 3920 - CainiSiPisici1

def Afisare(L, x):

   for i in range(1, L + 1):
       print(A[x[i]], end=)
   print()

def RestrictionCheck(c, p):

   if not (1 <= c <= 10) or not (1 <= p <= 10):
       print("Datele nu corespund restrictiilor impuse")
       return False
   return True

def OK(k, x, c, p):

   if k == 1 and x[k] != 0:
       return False
   if k == n and x[k] != 1:
       return False
   if c < 0 or p < 0:
       return False
   if k > 2 and x[k] == 0 and x[k-1] == 1 and x[k-2] == 0:
       return False
   return True

def Back(k, x, c, p):

   for i in range(2):
       x[k] = i
       if i == 0:
           c -= 1
       else:
           p -= 1
       if OK(k, x, c, p):
           if k == n:
               Afisare(n, x)
           else:
               Back(k + 1, x, c, p)
       if i == 0:
           c += 1
       else:
           p += 1

if __name__ == "__main__":

   A = ['C', 'P']
   c, p = map(int, input().split())
   if RestrictionCheck(c, p):
       n = c + p
       x = [0] * 21
       Back(1, x, c, p)

</syntaxhighlight>