Visszalépéses kiválogatás

Hasonló dokumentumok
Informatikai tehetséggondozás:

Adatszerkezetek II. 10. előadás

Kombinatorikai algoritmusok

Kombinatorikai algoritmusok. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Visszalépéses maximumkiválasztás

Visszalépéses keresés korlátozással

Informatikai tehetséggondozás:

Algoritmizálás, adatmodellezés tanítása 7. előadás

Összetett programozási tételek 2.

Rekurzió 2. Belépő a tudás közösségébe Informatika szakköri segédanyag

BACKTRACKING Visszalépéses keresés

Felvételi tematika INFORMATIKA

Algoritmizálás, adatmodellezés tanítása 1. előadás

Feladatmegoldási stratégiák

Multihalmaz, intervallumhalmaz

Programozási tételek. Dr. Iványi Péter

Összetett programozási tételek

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Problémamegoldási stratégiák

Hatékonyság 1. előadás

Rendezések. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar október 24.

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

INFORMATIKA javítókulcs 2016

Informatikai tehetséggondozás:

Sorozatok I. Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma)

Visszalépéses keresés

Algoritmizálás, adatmodellezés tanítása 8. előadás

Algoritmusok és adatszerkezetek I. 1. előadás

Közismereti informatika I. 4. előadás

Permutáció n = 3 esetében: Eredmény: permutációk száma: P n = n! romámul: permutări, angolul: permutation

Rekurzív algoritmusok

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

Adatbázis és szoftverfejlesztés elmélet. Programozási tételek

Bevezetés a programozásba I.

Hatékonyság 2. előadás

Műveletek mátrixokkal. Kalkulus. 2018/2019 ősz

Országos Középiskolai Tanulmányi Verseny 2009/2010 Matematika I. kategória (SZAKKÖZÉPISKOLA) 2. forduló feladatainak megoldása

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Backtrack-es feladat-variációk

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Kombinatorika. Permutáció

1. feladatsor: Vektorterek, lineáris kombináció, mátrixok, determináns (megoldás)

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny első fordulójának feladatai. INFORMATIKA II. (programozás) kategória

Egyszerű programozási tételek

ELEMI PROGRAMOZÁSI TÉTELEK

Algoritmizálás, adatmodellezés 1. előadás

Adatszerkezetek II. 6. előadás

A 2008/2009 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

OSZTHATÓSÁG. Osztók és többszörösök : a 3 többszörösei : a 4 többszörösei Ahol mindkét jel megtalálható a 12 többszöröseit találjuk.

Amortizációs költségelemzés

Dinamikus programozás II.

Definíció n egymástól megkülönböztethető elem egy sorrendjét az n elem egy (ismétlés nélküli) permutációjának nevezzük.

A sorozat fogalma. függvényeket sorozatoknak nevezzük. Amennyiben az értékkészlet. az értékkészlet a komplex számok halmaza, akkor komplex

A 2015/2016 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Algoritmizálás, adatmodellezés tanítása 2. előadás

Mohó stratégia. Feladat: Megoldás:

Informatikai tehetséggondozás:

A 2013/2014 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

2018, Diszkrét matematika

HHF0CX. k darab halmaz sorbarendezésének a lehetősége k! Így adódik az alábbi képlet:

Adatszerkezetek II. 1. előadás

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Algoritmizálás és adatmodellezés tanítása 2. előadás

FÖLDPRÖGETŐK TERMÉSZETTUDOMÁNYOS HÁZIVERSENY IV. FORDULÓ - Sakk 5 6. évfolyam

Assignment problem Hozzárendelési feladat (Szállítási feladat speciális esete)

Programozási segédlet

Klasszikus algebra előadás. Waldhauser Tamás április 14.

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

K O M B I N A T O R I K A P e r m u t á c i ó k, k o m b i n á c i ó k, v a r i á c i ó k

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

;3 ; 0; 1 7; ;7 5; 3. pozitív: ; pozitív is, negatív is: ;

Az összetett programozási tételek is egy tőről fakadnak

A 2011/2012 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Matematika tanmenet 2. osztály részére

Alkalmazott modul: Programozás

Elemi matematika szakkör

A számok kiírása is alapvetően karakterek kiírásán alapul, azonban figyelembe kell venni, hogy a számjegyeket, mint karaktereket kell kiírni.

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

Nagy Gábor compalg.inf.elte.hu/ nagy ősz

Algoritmusok és adatszerkezetek I. 10. előadás

A 2010/2011 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

7! (7 2)! = 7! 5! = 7 6 5! 5 = = ből 4 elem A lehetőségek száma megegyezik az 5 elem negyedosztályú variációjának számával:

Műveletek egész számokkal

Algoritmusok és adatszerkezetek 2.

43. ORSZÁGOS TIT KALMÁR LÁSZLÓ MATEMATIKAVERSENY MEGYEI FORDULÓ HATODIK OSZTÁLY JAVÍTÁSI ÚTMUTATÓ

Programozás II. előadás

Tartalom. Programozási alapismeretek. 11. előadás

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

8. GYAKORLÓ FELADATSOR MEGOLDÁSA. (b) amelyiknek mindegyik számjegye különböző, valamint a második számjegy a 2-es?

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Számelmélet I.

MATEMATIKA JAVÍTÁSI-ÉRTÉKELÉSI ÚTMUTATÓ

Megoldás: Mindkét állítás hamis! Indoklás: a) Azonos alapú hatványokat úgy szorzunk, hogy a kitevőket összeadjuk. Tehát: a 3 * a 4 = a 3+4 = a 7

Diszkrét matematika 1.

Diszkrét matematika I.

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

Optimalizációs stratégiák 2.

BME MOGI Gépészeti informatika 5.

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

Átírás:

elépő a tudás közösségébe Informatika szakköri segédanyag Heizlerné akonyi iktória, Horváth Győző, Menyhárt László, Szlávi Péter, Törley Gábor, Zsakó László Szerkesztő: Abonyi-Tóth Andor, Zsakó László A kiadvány A felsőoktatásba bekerülést elősegítő készségfejlesztő és kommunikációs programok megvalósítása, valamint az MTMI szakok népszerűsítése a felsőoktatásban (EFOP-3.4.4-16-2017-006) című pályázat keretében készült 2017-ben. 0

1. Az összes lehetséges sorrend Sokszor előfordul feladatként, hogy elő kell állítani valamilyen elemek összes lehetséges sorrendjét. Az egyszerűség kedvéért legyenek az elemek az 1,,N sorszámok. Ha ugyanis bármi más elemekről lenne szó, akkor azokat helyezzük el egy tömbbe és a sorszámukat használjuk indexelésre! Így például 4 elem összes lehetséges sorrendje: 1.: 1 2 3 4 2.: 1 2 4 3 3.: 1 3 2 4 4.: 1 3 4 2 5.: 1 4 2 3 6.: 1 4 3 2 7.: 2 1 3 4 8.: 2 1 4 3 9.: 2 3 1 4 10.: 2 3 4 1 11.: 2 4 1 3 12.: 2 4 3 1 13.: 3 1 2 4 14.: 3 1 4 2 15.: 3 2 1 4 16.: 3 2 4 1 17.: 3 4 1 2 18.: 3 4 2 1 19.: 4 1 2 3 20.: 4 1 3 2 21.: 4 2 1 3 22.: 4 2 3 1 23.: 4 3 1 2 24.: 4 3 2 1 Látszik ezen a számsorozaton, hogy mindegyik tagja 1 és 4 közötti (általános esetben 1 és N közötti), de minden szám pontosan egyszer fordul elő egy sorozatban. Másképp ránézve: annak 1-essel, 2- essel, 3-assal és 4-essel kezdődő típusúak. A megoldás is erre fog építeni, adjuk meg az összes 1- essel kezdődőt, az összes 2-essel kezdődőt, Az alábbi programban N az elemek száma, i pedig azon helyek száma, ahova már tettünk elemet, és x-ben tároljuk az aktuális permutációt. Megoldás(N,Db,Y): Db:=0 Összes_sorrend(1,N,Db,Y,x) Összes_sorrend(i,N,Db,Y,x): Ha i>n akkor Db:=Db+1; Y(Db):=x különben Ciklus j=1-től N-ig akkor x[i]:=j; Összes_sorrend(i+1,N,Db,Y,x) olt(i,j,x): k:=1 Ciklus amíg k<i és x[k] j k:=k+1 olt:=(k<i) Függvény vége. 1

Minta kódok C++ cpp/1_osszes_lehetseges_sorrend/feladat.cpp C# cs/1_osszes_lehetseges_sorrend/feladat.cs Java java/1_osszes_lehetseges_sorrend/feladat.java Pascal pas/1_osszes_lehetseges_sorrend/feladat.pas Python py/1_osszes_lehetseges_sorrend/feladat.py 2. Az összes lehetséges speciális sorrend Az 1,,N sorozat összes olyan permutációját állítsuk elő, ahol minden elem maximum 1 hellyel mozdul el a helyéről, azaz i-1 x[i] i+1! Így például 4 elem összes lehetséges olyan sorrendje, ahol az elemek a sorszámuktól legfeljebb 1 távolságra lehetnek: 1.: 1 2 3 4 2.: 1 2 4 3 3.: 1 3 2 4 4.: 2 1 3 4 5.: 2 1 4 3 Kiszámolhatjuk egy egyszerű rekurzív függvénnyel, hogy hány ilyen sorozat lehet. Egy ilyen sorrend vagy 1-essel kezdődik és mögötte N-1 szám összes lehetséges jó sorrendje van, vagy 2 1-gyel kezdődik és mögötte N-2 szám összes lehetséges jó sorrendje van. Azaz az N szám összes lehetséges jó sorrendje megegyezik N-1 szám összes lehetséges jó sorrendje + N-2 szám összes lehetséges jó sorrendjével: ami ezek szerint egy Fibonacci-szám. A rekurzív megoldásban tehát j értéke csak i-1, i vagy i+1 lehet, két kivétellel, az 1-est nem lehet előre hozni, az N értéket nem lehet hátrább tenni. Összes_jó_sorrend(i,N,Db,Y,x): Ha i>n akkor Db:=Db+1; y[db]:=x különben Ciklus j=i-1-től i+1-ig Ha j 1 és j N és nem olt(i,j,x) akkor x[i]:=j; Összes_jó_sorrend(i+1,N,Db,Y,x) 2

A feladat megoldása tesztelhető az elkészült forráskód feltöltésével itt: Weboldal Szint Téma Feladat https://mester.inf.elte.hu/ Haladó isszalépéses keresés 29. Az összes lehetséges speciális sorrend 3. Szóösszeadó fejtörő Jól ismert fejtörő, amelyben egy aritmetikai művelet kapcsol egybe szavakat. A feladat az, hogy a szavak egyes betűinek feleltessünk meg egy számjegyet úgy, hogy a művelet helyes eredményt szolgáltasson a szavakon. Pl. SEND + MORE = MONEY, vagy hagyományosan leírva: A szavakban előforduló jelekhez (SENDMORY) keressük a 0..9 számjegyek egyértelmű hozzárendelését! 1. megoldási ötlet ( algebrai hozzáállás ): D+E=Y, N+R=E, M=1 D+E=10+Y, N+R+1=E, M=1 2. megoldási ötlet: Az összes permutáció algoritmusára építünk. A betűkhöz számjegyeket rendelünk az összes lehetséges sorrendben, majd megnézzük, hogy ez a hozzárendelés jó-e az összegzés szerint. A Jó eljárás ellenőrzi a permutáció a feladat szempontjából való helyességét, és gondoskodik az esetleges megoldás gyűjtéséről vagy kiírásáról. A megfelelőség a (*) SEND + MORE MONEY = 0 egyenletre. Ha 'S' x[1] értékű, akkor a (*)-ban x[1] *1000-rel van jelen; 'E' x[2] értékű, akkor x[2]*[100+1-10]=x[2]*91-gyel; 'N' x[3] értékű, akkor x[3]*[10-100]= x[3]*[-90]-nel; 'D' x[4] értékű, akkor x[4]*[1]-gyel; 'M' x[5] értékű, akkor x[5]*[1000-10000]=x[5]*[-9000]-rel; 'O' x[6] értékű, akkor x[6]*[100-1000]= x[6]*[-900]-zal; 'R' x[7] értékű, akkor x[7]*10-zel; 'Y' x[8] értékű, akkor x[8]*[-1]-gyel van jelen. továbbá az S és az M betűhöz nem rendelhetünk nullát, azaz x[1] 0 és x[5] 0! Megoldás(Db,Y): Db:=0 Összes_sorrend(1,8,Db,Y,x) SEND + MORE MONEY 3

Összes_sorrend(i,N,Db,Y,x): Ha i=n+1 akkor Ha Jó(x) akkor Db:=Db+1; Y[db]:=x; Kiírás(x) különben Ciklus j=0-tól 9-ig akkor x[i]:=j; Összes_sorrend(i+1,N,Db,Y,x) Jó(x): jó:=(x[1]*1000+x[2]*91+x[3]*(-90)+x[4]*1+x[5]*(-9000)+ x[6]*(-900)+x[7]*10+x[8]*(-1)=0 és x[1] 0 és x[5] 0) Függvény vége. Egy megoldás kiírása a következőképpen nézhet ki: Konstans szöveg= SENDMORY Kiírás(x): Ciklus i=1-től 8-ig Ki: szöveg[i],x[i] Szebben kiírva: SEND 9567 + MORE + 1085 MONEY 10652 Megjegyzés: Hatékonyabb lenne, ha az utolsó feltételt kihasználnánk menet közben: továbbá az S és az M betűhöz nem rendelhetünk nullát, azaz x[1] 0 és x[5] 0. Összes_sorrend(i,N,Db,Y,x): Ha i=n+1 akkor Ha Jó(x) akkor Db:=Db+1; Y[Db]:=x; Kiírás(x) különben Ha i=1 vagy i=5 akkor jj:=1 különben jj:=0 Ciklus j=jj-től 9-ig akkor x[i]:=j; Összes_sorrend(i+1,N,Db,Y,x) 4

Minta kódok C++ cpp/3_szoosszeado_fejtoro/feladat.cpp C# cs/3_szoosszeado_fejtoro/feladat.cs Java java/3_szoosszeado_fejtoro/feladat.java Pascal pas/3_szoosszeado_fejtoro/feladat.pas Python py/3_szoosszeado_fejtoro/feladat.py Néhány hasonló fejtörő több összeadással: THIS + ISA +GREAT + TIME WASTER SATURN + URANUS +NEPTUNE + PLUTO PLANETS MARS + ENUS +SATURN +URANUS NEPTUNE HEART + EARS + NOSE +THROAT HEALTH És egy fejtörő szorzással: HE * HE = SHE 4. N-ből K az összes lehetséges sorrendben Egy iskolai versenyen N tanuló vett részt. Meg szeretnénk tudni, hogy az első 3 helyen milyen lehetséges tanuló sorrendek fordulhatnak elő. A feladat általánosítása: álasszunk ki N elemből K különböző elemet az összes lehetséges sorrendben (ismétlés nélküli variáció)! A megoldás ugyanolyan, mint N elem összes lehetséges sorbarendezése, csupán az így kapott sorozatoknak az első K tagját kell nézni. Ehhez nem is kell előállítani az összes sorrendet, hanem meg lehet állni akkor, amikor már az első K tagot ismerjük az adott sorozatból. Így például 4 elemből 2 elem összes lehetséges sorrendje: 1.: 1 2 2.: 1 3 3.: 1 4 4.: 2 1 5.: 2 3 6.: 2 4 7.: 3 1 8.: 3 2 9.: 3 4 10.: 4 1 11.: 4 2 12.: 4 3 5

Összes_sorrend(i,N,K,Db,Y,x): Ha i>k akkor Db:=Db+1; Y[Db]:=x különben Ciklus j=1-től N-ig akkor x[i]:=j; Összes_sorrend(i+1,N,K,Db,Y,x) A feladat megoldása tesztelhető az elkészült forráskód feltöltésével itt: Weboldal Szint Téma Feladat https://mester.inf.elte.hu/ Haladó isszalépéses keresés 26. N-ből K az összes lehetséges sorrendben 5. N-ből K az összes lehetséges növekvő sorrendben álasszunk ki N elemből K különböző elemet az összes lehetséges növekvő sorrendben (ismétlés nélküli kombináció)! A megoldás ugyanolyan, mint az N elemből K különböző elemet az összes lehetséges sorrendben feladaté, de csak olyan megoldásokat fogadunk el, ahol a kapott sorozat monoton növekvő. Így például 4 elemből 2 elem összes lehetséges növekvő sorrendje: 1.: 1 2 2.: 1 3 3.: 1 4 4.: 2 3 5.: 2 4 6.: 3 4 Ha a kapott sorozat csak monoton növekvő lehet, akkor persze az i-edik tagot elég az i-1. tagnál nagyobb lehetséges értékekre kipróbálni. Ugyancsak igaz, hogy a mögötte levőknek is kell hagyni értékeket, azaz a K. érték N-ig mehet, a K-1. érték N-1-ig, a K-2. érték N-2-ig, és így tovább. Összes_sorrend(i,N,K,Db,Y,x): Ha i>k akkor Db:=Db+1; Y[Db]:=x különben Ciklus j=x[i-1]+1-től N-(K-i)-ig akkor x[i]:=j; Összes_sorrend(i+1,N,K,Db,Y,x) Megjegyzés: Azaz ez a feladat nem is visszalépéses kiválogatás, mert minden úton megoldáshoz jutunk. Ha megengednénk az ismétlődéseket, akkor az algoritmus a ciklus határai egyszerűsödne, de szükség van egy X[0]=1 értékre. 2

Összes_sorrend(i,N,K,Db,Y,x): Ha i>k akkor Db:=Db+1; Y[Db]:=x különben Ciklus j=x[i-1]-től N-ig akkor x[i]:=j; Összes_sorrend(i+1,N,K,Db,Y,x) A feladat megoldása tesztelhető az elkészült forráskód feltöltésével itt: Weboldal Szint Téma Feladat https://mester.inf.elte.hu/ Haladó isszalépéses keresés 27. N-ből K az összes lehetséges növekvő sorrendben 6. Feladatok a sakktáblán N bástya elhelyezése egy NxN-es sakktáblán Helyezzünk el egy NxN-es sakktáblán az összes lehetséges módon N bástyát úgy, hogy ne üssék egymást! A bástyákról azt kell tudnunk, hogy a sorukban és az oszlopukban álló bábukat üthetik. Tehát úgy kell elhelyezni a bástyákat, hogy minden sorban és minden oszlopban is pontosan 1 bástya legyen! Ebből következik, hogy a megoldásokban elég azt megmondani, hogy az 1. oszlopban levő bástya melyik sorban áll, a második oszlopban levő bástya melyik sorban áll, és így tovább. Mivel mindegyiknek különböző sorokban kell állnia, ezért a feladat ugyanaz, mint az N elem összes lehetséges sorrendjének előállítása. Egy lehetséges megoldás N=8-ra: 3

Összes_bástya(i,N,Db,Y,x): Ha i>n akkor Db:=Db+1; Y[Db]:=x különben Ciklus j=1-től N-ig akkor x[i]:=j; Összes_bástya(i+1,N,Db,Y,x) olt(i,j,x): k:=1 Ciklus amíg k<i és x[k] j k:=k+1 olt:=(k<i) Függvény vége. A feladat megoldása tesztelhető az elkészült forráskód feltöltésével itt: Weboldal Szint Téma Feladat https://mester.inf.elte.hu/ Haladó isszalépéses keresés 23. N bástya N vezér elhelyezése egy NxN-es sakktáblán Helyezzünk el egy NxN-es sakktáblán az összes lehetséges módon N vezért úgy, hogy ne üssék egymást! A vezérekről azt kell tudnunk, hogy a sorukban, az oszlopukban és az átlójukban álló bábukat üthetik. Tehát úgy kell elhelyezni a vezéreket, hogy minden sorban és minden oszlopban is pontosan 1 vezér legyen, és minden átlóban legfeljebb 1 vezér legyen! Ebből következik, hogy a megoldásokban elég azt megmondani, hogy az 1. oszlopban levő bástya melyik sorban áll, a második oszlopban levő bástya melyik sorban áll, és így tovább. Egy lehetséges megoldás N=5-re és N=4-re: Itt tehát nem elég azt megnézni egy új vezér elhelyezésekor, hogy volt-e már a j. sorban vezér, hanem azt is kell, hogy volt-e már az (i,j) mezővel egy átlóban vezér. 4

Összes_vezér(i,N,Db,Y,x): Ha i>n akkor Db:=Db+1; Y[Db]:=x különben Ciklus j=1-től N-ig akkor x[i]:=j; Összes_vezér(i+1,N,Db,Y,x) olt(i,j,x): k:=1 Ciklus amíg k<i és x[k] j és i-k abs(j-x[k]) k:=k+1 olt:=(k<i) Függvény vége. Megjegyzés: Amíg a bástyás feladatnak mindig van (méghozzá nagyon sok) megoldása, addig a vezéres feladatnak N=2 és N=3 esetén biztosan nincs egy megoldása sem, más N-ek esetén pedig vannak megoldások, de sokkal kevesebb, mint a bástyás feladatnál. Példa: az alábbi sakktáblákra nem lehet elhelyezni 2, illetve 3 vezért úgy, hogy ne üssék egymást: A feladat megoldása tesztelhető az elkészült forráskód feltöltésével itt: Weboldal https://mester.inf.elte.hu/ Szint Haladó Téma isszalépéses keresés Feladat 24. N vezér (összes megoldás) 5