3918 - Back Cp

De la Universitas 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

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