3577 - Origami 1

De la Universitas MediaWiki

Enunt

Costel este pasionat de arta orientală a confecţionării obiectelor de hârtie, origami, dar este abia la început şi trebuie să se familiarizeze cu operaţiile de îndoire corectă a hârtiei. El are la dispoziţie o foaie de hârtie pătrată, ruptă dintr-un caiet de matematică, având dimensiunea de exact N x N pătrăţele. Îndoiturile trebuie realizate exact pe o linie orizontală sau verticală. Sunt permise două tipuri de îndoituri:

îndoitura de tipul 1, îndoitură verticală executată la X pătrăţele faţă de marginea stângă a foii: partea din stânga a foii se pliază către dreapta, de-a lungul liniei verticale aflate la distanţa de X pătrăţele faţă de marginea stângă; îndoitura de tipul 2, îndoitură orizontală executată la X pătrăţele faţă de marginea superioară a foii: partea de sus a foii se pliază în jos, de-a lungul liniei aflate la distanţa de X pătrăţele faţă de marginea de sus a hârtiei.

În urma realizării unei succesiuni de îndoituri, din foaia iniţială de hârtie se va obţine un obiect, care va avea o formă dreptunghiulară, cu înălţimea H, lăţimea M şi având grosimea egală cu numărul maxim de foi care se suprapun în cadrul obiectului obţinut.

Cerinţa

Dată fiind o succesiune de îndoituri aplicată unei foi de dimensiune N x N, scrieţi un program care să determine înălţimea, lăţimea şi grosimea obiectului obţinut.

Date de intrare

Fişierul de intrare origami1.in are următoarea structură :

  • prima linie a fişierului conţine un număr natural N, reprezentând dimensiunea iniţială a hârtiei;

a doua linie conţine un număr natural K, reprezentând numărul îndoiturilor;

  • pe următoarele K linii se găsesc perechi de numere naturale nenule, A B, separate printr-un spaţiu, reprezentând tipul îndoiturii ( A este 1 dacă se realizează o îndoitură verticală sau A este 2 dacă se realizează o îndoitură orizontală), respectiv la ce distanţă se realizează îndoitura;

Date de ieșire

Fişierul de ieşire origami1.out va conţine, pe o singură linie, trei numere naturale nenule H, L, G, separate prin câte un spaţiu, reprezentând înălţimea, lăţimea şi respectiv grosimea obiectului obţinut.

Restricţii şi precizări

  • 2 ≤ N ≤ 170
  • 1 ≤ K ≤ 2N-2
  • A = 1 sau A = 2
  • 1 ≤ B < înălţimea sau lăţimea hârtiei la momentul respectiv (funcţie de tipul îndoiturii)

Exemplu

origami1.in
4
3
1 3
2 3
1 1
origami1.out
3 2 6


Explicație

Hârtia are 4 unităţi înălţime şi 4 unităţi lăţime. Prima îndoitură se realizează de la stânga la dreapta, de-a lungul celei de-a treia linii verticale faţă de marginea stângă a foii. Se obţine o foaie de înălţime 4, lăţime 3 şi grosime 2. A doua îndoitură se realizează îndoind partea superioară a foii, în jos, de-a lungul celei de-a treia linii orizontale faţă se marginea de sus a foii. Se obţine un obiect de înălţime 3, lăţime 3 şi grosime 4. După a treia îndoitură se obţine obiectul final, având înălţimea 3, lăţimea 2 şi grosimea 6.

Rezolvare

def fold_paper(N, K, folds):
    height = N
    width = N
    thickness = 1

    for fold_type, position in folds:
        if fold_type == 1:
            # Îndoitură verticală
            width = min(position, N - position)
            thickness *= 2
        elif fold_type == 2:
            # Îndoitură orizontală
            height = min(position, N - position)
            thickness *= 2

    return height, width, thickness

def main():
    with open("origami1.in", "r") as fin:
        N = int(fin.readline())
        K = int(fin.readline())
        folds = [list(map(int, fin.readline().split())) for _ in range(K)]

    height, width, thickness = fold_paper(N, K, folds)

    with open("origami1.out", "w") as fout:
        fout.write(f"{height} {width} {thickness}\n")

if __name__ == "__main__":
    main()