330 likes | 548 Views
KLASISKS UZDEVUMS. Cik veidos iespējams novietot astoņas dāmas tā, lai neviena neapdraudētu nevienu citu, t.i., lai nekādas divas dāmas neatrastos uz vienas vertikāles, horizontāles vai diagonāles. LĪDZĪGS (ARĪ KLASISKS) UZDEVUMS.
E N D
KLASISKS UZDEVUMS Cik veidos iespējams novietot astoņas dāmas tā, lai neviena neapdraudētu nevienu citu, t.i., lai nekādas divas dāmas neatrastos uz vienas vertikāles, horizontāles vai diagonāles.
LĪDZĪGS (ARĪ KLASISKS) UZDEVUMS Kā uz šaha galdiņa ar izmēriem nn izvietot n dāmas tā, lai neviena neapdraudētu nevienu citu, t.i., lai nekādas divas dāmas neatrastos uz vienas vertikāles, horizontāles vai diagonāles. n=1 n=2 n=3 n=4 n=5
KĀ RISINĀT ? (Neobjektorientētā pieeja - I) • ir šaha galdiņš uz kura es (vai mana programma) cenšas izvietot figūras • sākumā visi lauciņi ir brīvi
1.solis • izvēlamies kādu lauciņu un novietojam tajā pirmo dāmu • atzīmē kā aizņemtu gan to lauciņu, uz kura atrodas dāma, gan tos, kurus šī dāma apdraud
2.solis • izvēlamies kādu brīvu (neatzīmētu) lauciņu un novietojam tajā otro dāmu • atzīmē kā aizņemtu gan to lauciņu, uz kura atrodas dāma, gan tos, kurus šī dāma apdraud
3.solis • izvēlamies kādu brīvu (neatzīmētu) lauciņu un novietojam tajā trešo dāmu • atzīmē kā aizņemtu gan to lauciņu, uz kura atrodas dāma, gan tos, kurus šī dāma apdraud
4.solis • izvēlamies kādu brīvu (neatzīmētu) lauciņu un novietojam tajā ceturto dāmu • atzīmē kā aizņemtu gan to lauciņu, uz kura atrodas dāma, gan tos, kurus šī dāma apdraud
5.solis • izvēlamies kādu brīvu (neatzīmētu) lauciņu un novietojam tajā piekto dāmu • atzīmē kā aizņemtu gan to lauciņu, uz kura atrodas dāma, gan tos, kurus šī dāma apdraud
6.solis • izvēlamies kādu brīvu (neatzīmētu) lauciņu un novietojam tajā sesto dāmu • atzīmē kā aizņemtu gan to lauciņu, uz kura atrodas dāma, gan tos, kurus šī dāma apdraud
7.solis • izvēlamies kādu brīvu (neatzīmētu) lauciņu un novietojam tajā septīto dāmu • nav vairs, ko atzīmēt, nav arī brīvu lauciņu.Ko nu? (Pēc teorijas taču zinām, ka var)
Ko iesākt? • vajadzētu pakāpties kādu soli atpakaļ ? • vai mākam to izdarīt? Ja nav zināms, kurā solī kuras rūtiņas atzīmēja, tad nekā...
Uzlabotā bilde • redzams kurā solī kura rūtiņa tika atzīmēta
Uzlabotā bilde (2) • redzams, kurā solī, kura rūtiņa tika atzīmēta • var pakāpties atpakaļ un pamēģināt citu variantu
Modificēta pieeja - 1.solis • izvēlamies kādu lauciņu un novietojam tajā pirmo dāmu 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 • atzīmē, cik dāmas apdraud katru lauciņu. • Zīmējumā neatzīmētajām ir 0.
Modificēta pieeja - 2.solis • izvēlamies kādu brīvu lauciņu un novietojam tajā otro dāmu 1 1 1 1 1 2 1 1 1 1 1 2 1 2 2 2 1 1 1 1 1 2 2 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 • atzīmē, cik dāmas apdraud katru lauciņu. • Var turpināt un nav problēmu ar atgriešanos.
Neobjektorientētā pieeja - II • ir šaha galdiņš uz kura es (vai mana programma) cenšas izvietot figūras • sākumā visi lauciņi ir brīvi • katrai dāmai jāatrodas savā rindā (i-to dāmu liksim i-tajā rindā)
KO PĀRBAUDĪT? • liekot katru nākošo dāmu, jāpārbauda, vai katrā no trīs virzieniem zem sitiena neatrodas kāda cita dāma
KĀ RĪKOTIES TĀLĀK? Tā turpinot atradīs derīgu risinājumu (ja tāds principā ir atrodams).
OBJEKTORIENTĒTĀ PIEEJA • AIZMIRSTAM PAR ŠAHA GALDIŅU !!!( nekādu masīvu vai citu konstrukciju, kas par to liecinātu ) Mūsu uzdevums ir izveidot klasi DĀMA, kurasobjekti paši mācēs atrast vietu, kur tiem ir jābūt. Šaha galdiņš paliek tikai programmētāja galvā!
OBJEKTORIENTĒTĀ PIEEJA • Veido tādu mehānismu (klases DĀMA objekti), kas pats atklās atrisinājumu • Līdzīgi Visuma radīšanai un iekustināšanai. (Ne es bīdīšu, bet dāmas pašas “pārvietosies” pa šaha galdiņu). • Nav viena pārvaldnieka (pārrauga, saimnieka)
PAMATIDEJAS • Izmantosim īpašību, ka i-tā dāma jānovieto i-tajā rindā. Dāmai būs jāatrod sev piemērota kolona. • Jābūt metodei, kas ļauj noskaidrot, vai dāma neapdraud citas dāmas. • Izmantosim ģeneratora ideju - jābūt iespējai dāmai “palūgt” atrast sev piemērotu vietu, vai arī pāriet uz citu, ja esošā mūs kādu iemeslu dēļ neapmierina.
NORĀDES • Katra dāma būs saistīta tikai ar iepriekšējās rindas dāmu. (Būs norāde uz to.) Dāma1 Dāma2 Dāma3 Dāma4 Dāma5 Ziņojumus sūtīsim tikai pēdējai dāmai, kura, savukārt, sūtīs ziņojumu iepriekšējai dāmai.
KLASE public class Dama { static int damu_skaits = 8; static int variantu_sk = 0; private Dama kaiminiene; private int kolonna; private int rinda; Dama (int rind, Dama kaimn) { rinda = rind; kaiminiene = kaimn; kolonna = 0;} public boolean atrodi_jaunu_vietu() {…} public void izdruka() { …} private boolean var_nosist (int parb_kolonna, int parb_rinda) {…} Iespējams, ka “var_nosist” vietā veiksmīgāks nosaukums būtu “apdraud”.
METODES private boolean var_nosist (int parb_kolonna, int parb_rinda) { // pārbauda kolonnas if (kolonna == parb_kolonna) return true; // pārbauda diagonāles int rindu_starpiba = parb_rinda - rinda; if ((kolonna + rindu_starpiba == parb_kolonna) || (kolonna - rindu_starpiba == parb_kolonna)) return true; // pārbauda kaimiņienes tālāk return (kaiminiene!=null) && kaiminiene.var_nosist(parb_kolonna, parb_rinda); }
METODES public boolean atrodi_jaunu_vietu() { do { kolonna++; if (kolonna>damu_skaits) { kolonna=0; if (kaiminiene!=null) return (kaiminiene.atrodi_jaunu_vietu())&&atrodi_jaunu_vietu(); else return false; } } // pārbauda pozīciju attiecībā pret kaimiņienēm while ((kaiminiene!=null) && kaiminiene.var_nosist(kolonna, rinda) ); return true; }
GALVENĀ PROGRAMMA public static void main(String[] args) { Dama beidzamaDama = null; for (int i = 1; i <= damu_skaits; i++) { beidzamaDama = new Dama(i, beidzamaDama); beidzamaDama.atrodi_jaunu_vietu(); } do { beidzamaDama.izdruka(); } while (beidzamaDama.atrodi_jaunu_vietu()) ; } Kas notiks, ja damu_skaits būs 0 ?
MODIFICĒTS VARIANTS Dāma1 ir īpaša, jo tai nav kaimiņienes Dāma1 Dāma2 Dāma3 Dāma4 Dāma5
MODIFICĒTS VARIANTS No klases Dāma varam atvasināt klasi NullesDāma un pārrakstīt dažas metodes. NullesDāma1 Dāma1 Dāma2 Dāma3 Dāma4 Dāma5
IEGUVUMS Vairs nav jāpārbauda, vai kaimiņiene reāli eksistē. Pielietojam metodes tāpat kā “īstai” Dāmai. Bija: return kaiminiene && kaiminiene->var_nosist(parb_kolonna, parb_rinda); Tagad: return kaiminiene->var_nosist(parb_kolonna, parb_rinda);
PAPILDUS DARBS Jāveido papildus klase un jāapraksta metodes. Jāmodificē arī klase Dāma. class NullesDama extends Dama{ public NullesDama() { rinda = 0; kaiminiene = null; kolonna = 0;} public boolean var_nosist (int parb_kolonna, int parb_rinda) { return false; } public boolean atrodi_jaunu_vietu() { return false; } public boolean izdruka() { return false; } }
GALVENĀ PROGRAMMA (JAUNAIS VARIANTS AR PAPILDUS KLASI “Galvena”) Galvena(int damuSkaits) { damu_skaits = damuSkaits; Dama beidzamaDama = new NullesDama(); beidzamaDama.var_nosist(1,1); for (int i = 1; i <= damu_skaits; i++) { beidzamaDama = new Dama(i, beidzamaDama); beidzamaDama.atrodi_jaunu_vietu(); } do beidzamaDama.izdruka(); while (beidzamaDama.atrodi_jaunu_vietu()) ; } public static void main(String[] args) { Galvena g = new Galvena(8); }