Zadanie

Táto úloha sa dá nahradiť riešením sady variables_cpp na Liahni (betaliahen.ksp.sk) . Ak chceš, aby ti namiesto bodov za riešenie tejto úlohy boli započítané body získané riešením spomínanej sady, na stránke odovdzaj pdf-ko s prezývkou, ktorú používaš na Liahni.

Ak máte akékoľvek otázky ohľadom tejto úlohy napíšte Kubovi Havelkovi na

Istý Cézar veľmi rád hádzal kocky. Nevedel však, že rozloženie čísel na kocke by malo podliehať špecifickému dizajnu, preto boli čísla od 1 do 6 vytesané do kociek náhodne. Dokonca rôzne kocky ich mali usporiadané inak.

Kocky sú hodené. A čo teraz s nimi? Keďže bol Cézar veľký fanúšik bojovej techniky, zaumienil si postaviť z nich nový model bojovej veže. Strávil niekoľko hodín opatrným ukladaním kociek na seba a vylaďovaním otočenia kociek tak, aby boli pekne zarovnané a ani kúsok nevytŕčal von. Keď ju konečne dostaval, začal sa trochu obávať. Veža je tenká a niekto by ju mohol jediným drgnutím zbúrať. Treba si preto spraviť zálohu.

Začal teda spisovať všetky potrebné informácie. Najprv na prvý riadok napísal počet použitých kociek. Potom do ďalšieho riadku napísal číslo na vrchnej stene najvyššej kocky. Do každého z nasledujúcich riadkov napísal medzerami oddelené štyri čísla, ktoré boli vidieť na danej kocke z boku.

Úloha

Vašou úlohou je napísať a odovzdať program, ktorý vypočíta súčet čísel, ktoré sú na tých stenách kociek, ktoré nevidno, lebo sú zakryté podlahou alebo inou kockou.

Program bude testovaný na piatich sadách vstupov. Pre jednotlivé sady platia obmedzenia na výšku veže uvedené v tabuľke. Body dostanete za každú sadu, ktorú úspešne vyriešite.

Číslo sady 1 2 3 4 5
Maximálna výška veže 1 10 50 100 1000

Vstup

Vstup sa nachádza na štandardnom vstupe. Na jeho načítanie môžete použiť v Pascale funkciu readln(premenna), v Pythone funkciu premenna=input() a v C++ funkciu cin >> premenna.

Vstup vyzerá tak, ako bol popísaný v zadaní. Na prvom riadku je číslo \(n\) udávajúce počet kociek a teda aj výšku veže. Na ďalšom riadku je jedno číslo, ktoré udáva počet bodiek na vrchnej stene najvyššej kocky. Nasleduje \(n\) riadkov, ktoré postupne (od vrchu po spodok) popisujú, ktoré čísla sú na bočných stranách všetkých kociek. V prvom takomto riadku sú teda štyri čísla, ktoré určujú čísla na bokoch najvyššej kocky, v druhom riadku štyri čísla z bokov kocky pod ňou atď.

Výstup

Výsledok, teda súčet zakrytých čísel, vypíšte na štandardný výstup, v Pascale na to slúži funkcia writeln(vysledok), v Pythone print(vysledok) a v C++ cout << vysledok.

Nezabudnite za číslom dať koniec riadka. writeln() a print() to za vás spravia automaticky, v C++ musíte napísať ešte cout << endl.

Príklady

Input:

1
5
1 3 6 4

Output:

2

Jediná kocka, z ktorej nevidíme práve číslo 2.

Input:

3
3
1 5 2 4
3 1 6 5
4 6 3 2

Output:

18

Tu sú na seba poukladané tri kocky. Z najvrchnejšej nevidíme číslo 6, z druhej čísla 2 a 4 a z tretej čísla 1 a 5. To dáva v súčte 18.

Aj napriek tomu, že táto úloha nebola myšlienkovo náročná, dala sa riešiť jednoduchším a komplikovanejším spôsobom. Častokrát, práve to komplikovanejšie riešenie je to, čo nás napadne ako prvé, oplatí sa však nad úlohou trochu zamyslieť a prísť s riešením, ktoré je lepšie. To nám totiž ušetrí kopec problémov a chýb.

Najjednoduchšie čo nás napadne je postupne pre každú kocku vo for-cykle načítať viditeľné čísla, z čoho vieme zistiť, ktoré čísla sú skryté. Tie následne sčítame dokopy a máme riešenie.

Môžeme si však uvedomiť, že nepotrebujeme vedieť ktoré čísla sú zakryté. Zaujíma nás totiž iba ich súčet. Keďže vieme, že každá kocka má rovnaký súčet čísel na jej stenách (\(1+2+3+4+5+6=21\)), tak nám stačí zrátať si čísla, ktoré vidíme a odrátať ich od súčtu čísel na kocke. Celé riešenie teda vyzerá tak, že pre každú kocku načítame viditeľné strany, odrátame ich od \(21\) a tieto čiastkové výsledky spočítame.

Rovnako dobré a možno o malý kúsok ľahšie riešenie na implementáciu je najskôr si zrátať súčet čísel na celej veži (počet kociek \(\times\) súčet čísel na jednej kocke) a od neho postupne odrátať všetky čísla, ktoré sú uvedené na vstupe, keďže to sú čísla, ktoré vidíme.

#include <iostream>

using namespace std;

int main(){

    int n;
    cin >> n;

    int vsetky = 21*n;   // zratame si celkovy sucet cisel na kockach

    int vidim;
    cin >> vidim;    // nacitame hornu stranu prvej kocky
    vsetky -= vidim; // a odratame od celkoveho suctu

    // pre kazdu kocku chceme nacitat viditelne cisla
    for (int i=0; i<n; i++){
        for (int j=0; j<4; j++){
            cin >> vidim;    // postupne nacitame styri cisla z toho isteho riadku
            vsetky -= vidim; // a odratame ich od celkoveho suctu
        }
    }

    cout << vsetky << endl;

    return 0;
}
Program kocky;

var
  n, vsetky, kocka, i, j: Integer;

begin

  Readln(n);
  vsetky := 21*n;  // zratame si celkovy sucet cisel na kockach

  Readln(kocka);            // nacitame hornu stranu prvej kocky
  vsetky := vsetky - kocka; // a odratame od celkoveho suctu

  // pre kazdu kocku chceme nacitat viditelne cisla
  for i := 1 to n do
    for j := 1 to 4 do
      begin
        Read(kocka); // postupne nacitame styri cisla z toho isteho riadku
        vsetky := vsetky-kocka; // a odratame ich od celkoveho suctu
      end; 

  Writeln(vsetky);

end.
n = int(input())

# vyratame si celkovy pocet kociek
vsetky = 21*n

vrchna = int(input())
vsetky -= vrchna;

for i in range(n):
    # nacitame riadok a rozdelime ho podla medzier na styri casti
    vidim = input().split()
    
    for x in vidim:
        # postupne odratame jednotlive cisla
        vsetky -= int(x)


print(vsetky)

Diskusia

Tu môžte voľne diskutovať o riešení, deliť sa o svoje kusy kódu a podobne.

Pre pridávanie komentárov sa musíš prihlásiť.