3919 - Back ME

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 E și m litere M cu proprietatea că nu există mai mult de două litere M alăturate și nici mai mult de două litere E alăturate.

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 ≤ 17, 0 ≤ m ≤ 17
  • 0 ≤ n + m ≤ 28
  • Dacă nu există cuvinte care să respecte condițiile, atunci se va afișa IMPOSIBIL.

Exemplul 1:[edit | edit source]

Intrare

3  3

Ieșire

EEMEMM
EEMMEM
EMEEMM
EMEMEM
EMEMME
EMMEEM
EMMEME
MEEMEM
MEEMME
MEMEEM
MEMEME
MEMMEE
MMEEME
MMEMEE

Exemplul 2:[edit | edit source]

Intrare

18 29

Ieșire

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def afisare(v, st, e, m):

   for i in range(1, e + m + 1):
       print(v[st[i]], end=)
   print()

def valid(v, st, k, e, m):

   for i in range(1, k - 1):
       if v[st[i]] == 'E' and v[st[i + 1]] == 'E' and v[st[i + 2]] == 'E':
           return False
       if v[st[i]] == 'M' and v[st[i + 1]] == 'M' and v[st[i + 2]] == 'M':
           return False
   if k == e + m:
       E, M = 0, 0
       for i in range(1, k + 1):
           if v[st[i]] == 'E':
               E += 1
           else:
               M += 1
       if E != e or M != m:
           return False
   return True

def bck(v, st, k, e, m, g):

   for i in range(2):
       st[k] = i
       if valid(v, st, k, e, m):
           if k == e + m:
               g[0] = 1
               afisare(v, st, e, m)
           else:
               bck(v, st, k + 1, e, m, g)

def check_restrictions(n, m):

   if 0 <= n <= 17 and 0 <= m <= 17 and 0 <= n + m <= 28:
       return True
   else:
       print("Datele nu corespund restrictiilor impuse")
       return False

def main():

   e, m = map(int, input().split())
   
   if not check_restrictions(e, m):
       return
   
   v = [] * 109
   st = [0] * 109
   g = [0]
   v[0], v[1] = 'E', 'M'
   bck(v, st, 1, e, m, g)
   if g[0] == 0:
       print("IMPOSIBIL")

if __name__ == "__main__":

   main()

</syntaxhighlight>