Ćwiczenia do Modułu 1: Różnice pomiędzy wersjami
Zadanie o fladze polskiej |
|||
| Linia 1: | Linia 1: | ||
Ta strona będzie zawierać | Ta strona będzie zawierać podstawowe zadania na tablice. | ||
== Zadanie 1 (Flaga polska)== | |||
Tablica A typu array[1..N] of integer (N > 0) wypełniona zerami i jedynkami reprezentuje ciąg N urn w których znajdują się żetony białe (0) i czerwone (1). Należy podać algorytm działania automatu przestawiającego żetony w urnach tak, by najpierw były żetony białe, potem czerwone. Robot może wykonywać dwa rodzaje operacji: | |||
*Kol(i) - podaje kolor żetonu w i-tej urnie (1 ≤ i ≤ n) | |||
*Z(i,j) - zamienia żetony z i-tej i j-tej urny (1 ≤ i,j ≤ n) | |||
Uwagi: | |||
#Operacja Kol jest bardzo kosztowna, więc zależy nam na tym by kolor każdego żetonu był sprawdzany co najwyżej raz. | |||
#Robot potrafi zapamiętać tylko kilka wartości z przedziału 0..N+1. | |||
#Nie można założyć, że występuje choć jeden żeton w każdym z kolorów. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Możliwe roziązania | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
=== Rozwiązanie 1 === | === Rozwiązanie 1 === | ||
'''program''' | '''program''' FlagaPolska1(N,A); | ||
'''const''' bialy = 0; | |||
czerwony = 1; | |||
'''var''' b,c : integer; | |||
'''begin''' | |||
b:=1; c:=n; | |||
'''while''' b < c '''do''' | |||
'''if''' Kol(b)=bialy '''then''' b:=b+1 | |||
'''else''' '''begin''' | |||
Z(c,b); | |||
c:=c-1; | |||
'''end'''; | |||
'''end'''. | |||
</div> | |||
Rozwiązanie 1 optymalizuje liczbę sprawdzeń kolorów, ale może niepotrzebnie zamieniać czerwone z czerwonymi. Mozna tego uniknąć wprowadzając dodatkową pętlę po czerwonych od końca tablicy. | |||
<div class="mw-collapsible-content" style="display:none"> | |||
=== Rozwiązanie 2 === | |||
'''program''' FlagaPolska2(N,A); | |||
'''const''' bialy = 0; | |||
czerwony = 1; | |||
'''var''' b,c : integer; | |||
'''begin''' | |||
b:=1; c:=n; | |||
'''while''' b < c '''do''' | |||
'''if''' Kol(b)=bialy '''then''' b:=b+1 | |||
'''else''' '''begin''' | |||
'''while''' Kol(c)=czerwony '''and''' (b<c) '''do''' c:=c-1; | |||
'''if''' b<c '''then''' '''begin''' | |||
Z(c,b); | |||
c:=c-1; | |||
'''end'''; | |||
'''end'''; | |||
'''end'''. | |||
</div> | |||
W rozwiązaniu 2 są dwie zagnieżdżone pętle while. Trzeba zwrócić uwagę, że gdyby nie warunek b<c to w przypadku tablicy zawierającej same białe żetony doszłoby do wyjścia poza zakres (odwołanie do Kol(0)). Można uniknąć zagnieżdżonych while'i trzeba jednak uważać aby nie sprawdzać kilka razy koloru tego samego żetonu. | |||
<div class="mw-collapsible-content" style="display:none"> | |||
=== Rozwiązanie 3 === | |||
'''program''' FlagaPolska3(N,A); | |||
'''const''' bialy = 0; | |||
czerwony = 1; | |||
'''var''' b,c : integer; | |||
'''begin''' | |||
b:=1; kb:=Kol(b); | |||
c:=n; kc:=Kol(c); | |||
'''while''' b < c '''do''' | |||
'''if''' kb=bialy '''then''' '''begin''' | |||
b:=b+1; | |||
kb:=Kol(b); | |||
'''end''' | |||
'''else''' '''if''' kc=czerwony '''then''' '''begin''' | |||
c:=c-1; | |||
kc:=Kol(c); | |||
'''end''' '''else''' '''begin''' | |||
Z(c,b); | |||
b:=b+1; | |||
c:=c-1; | |||
'''if''' b < c '''then''' '''begin''' | |||
kb:=Kol(b); | |||
kc:=Kol(c); | |||
'''end;'''; | |||
'''end;''' | |||
'''end'''. | |||
</div> | |||
W rozwiązaniu 3 każdy żeton jest sprawdzany co najwyżej raz, a każda zamiana ustawia na dobrych miejscach 2 żetony (czyli zamian jest co najwyżej N div 2). Alternatywne rozwiązanie, unikające zagnieżdżonych pętli jest poniżej. Jednak dla tablicy złożonej z jednego żetonu czerwonego i potem samych białych będzie potrzeba N-1 zamian. | |||
<div class="mw-collapsible-content" style="display:none"> | |||
=== Rozwiązanie 4 === | |||
'''program''' FlagaPolska4(N,A); | |||
'''const''' bialy = 0; | |||
czerwony = 1; | |||
'''var''' b,c : integer; | |||
'''begin''' | '''begin''' | ||
b:=1; c:=1; | |||
'''while''' b <= N '''do''' | |||
'''if''' Kol(c)=czerwony '''then''' c:=c+1 | |||
'''else''' '''begin''' | |||
Z(c,b); | |||
b:=b+1; | |||
c:=c+1; | |||
'''end'''; | |||
'''end'''. | '''end'''. | ||
</div> | </div> | ||
</div> | </div> | ||
Wersja z 17:03, 6 lip 2006
Ta strona będzie zawierać podstawowe zadania na tablice.
Zadanie 1 (Flaga polska)
Tablica A typu array[1..N] of integer (N > 0) wypełniona zerami i jedynkami reprezentuje ciąg N urn w których znajdują się żetony białe (0) i czerwone (1). Należy podać algorytm działania automatu przestawiającego żetony w urnach tak, by najpierw były żetony białe, potem czerwone. Robot może wykonywać dwa rodzaje operacji:
- Kol(i) - podaje kolor żetonu w i-tej urnie (1 ≤ i ≤ n)
- Z(i,j) - zamienia żetony z i-tej i j-tej urny (1 ≤ i,j ≤ n)
Uwagi:
- Operacja Kol jest bardzo kosztowna, więc zależy nam na tym by kolor każdego żetonu był sprawdzany co najwyżej raz.
- Robot potrafi zapamiętać tylko kilka wartości z przedziału 0..N+1.
- Nie można założyć, że występuje choć jeden żeton w każdym z kolorów.
Możliwe roziązania
Rozwiązanie 1 optymalizuje liczbę sprawdzeń kolorów, ale może niepotrzebnie zamieniać czerwone z czerwonymi. Mozna tego uniknąć wprowadzając dodatkową pętlę po czerwonych od końca tablicy.
W rozwiązaniu 2 są dwie zagnieżdżone pętle while. Trzeba zwrócić uwagę, że gdyby nie warunek b<c to w przypadku tablicy zawierającej same białe żetony doszłoby do wyjścia poza zakres (odwołanie do Kol(0)). Można uniknąć zagnieżdżonych while'i trzeba jednak uważać aby nie sprawdzać kilka razy koloru tego samego żetonu.
W rozwiązaniu 3 każdy żeton jest sprawdzany co najwyżej raz, a każda zamiana ustawia na dobrych miejscach 2 żetony (czyli zamian jest co najwyżej N div 2). Alternatywne rozwiązanie, unikające zagnieżdżonych pętli jest poniżej. Jednak dla tablicy złożonej z jednego żetonu czerwonego i potem samych białych będzie potrzeba N-1 zamian.