3919 - Back ME

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 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

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 ≤ 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:

Intrare

3  3

Ieșire

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

Exemplul 2:

Intrare

18 29

Ieșire

Datele nu corespund restrictiilor impuse

Rezolvare

<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>