Download presentation
Presentation is loading. Please wait.
1
SUDOKU Ivo Doko Saša Buzov
2
Sadržaj Povijest slagalice Sudoku Rješavanje slagalica
Generiranje novih slagalica Zaključak Literatura U hr. jeziku je pravilno npr. operacijski sustav Linux, a ne Linux operacijski sustav; toga se doduše ne drže niti na TV-u Nema potrebe stalno pisati Sudoku
3
Povijest Sudoku-a Sudoku – “Suuji wa dokushin ni kagiru” => broj se smije pojaviti samo jednom (su – broj, doku – sam) 18. st. – Leonhard Euler – Pravilo “Latinskih kvadrata” – brojevi u matrici se pojavljuju samo jednom vodoravno i okomito 1979.g. – Howard Garns – Dell Magazine – “Number Place” – dodano ograničenje da nema ponavljanja brojeva niti u jednom od 9 blokova
4
vrsta slagalice čije je rješavanje temeljeno na logici, najčešće nekim metodama eliminacije
sastoji se od 1 velikog kvadratnog polja podijeljeno na 81 manjih kvadrata cilj igre – ispuniti sva polja (kvadrate) brojevima od 1 do 9, s time da se 1 broj smije pojaviti samo jednom u svakom retku i stupcu i svakom bloku od 3x3 polja
6
najčešći oblik igre – 9x9 ostale verzije – 4x4, 5x5, 6x6, 7x7, 12x12, 16x16, 25x25 postoje i verzije sa simbolima, slovima, riječima (Wordoku), jig-saw i sl.
7
Primjeri slagalica:
8
korištenje igre Sudoku:
zabava testiranje inteligencije steganografija (znanstvena disciplina koja se bavi skrivanjem informacija)
9
bool determinepossiblevalues() - Odredi moguće vrijednosti za sva polja
u tablici, vrati false ako postoji mjesto bez ijedne moguće vrijednosti. inline bool checksingles(log& changes) - Provjeri postoji li mjesto u tablici koje ima samo jednu moguću vrijednost, ako postoji to mjesto popuni i vrati true, inače vrati false. inline bool checkrows(log& changes - Za svaki redak tablice provjeri postoji li vrijednost koja se može upisati na samo jedno mjesto, ako postoji upiše je i vrati true, inače vrati false. inline bool checkcolumns(log& changes) - Isto kao checkrows samo za stupce. inline bool checkblocks(log& changes) - Isto kao checkrows i checkcolumns samo za 3x3 blokove. log changes – log je klasa koju smo konstruirali kako bi u nju spremali sve promjene koje smo napravili za potrebe backtrackinga
10
do{ do{if(!determinepossiblevalues()) obrisi sve promjene i vrati 0; ako smo došli do rješenja povećaj za 1 broj ukupnih rješenja; } while checksingles( changes) ; if (!determinepossiblevalues()) obrisi sve promjene i vrati 0; ako smo došli do rješenja povećaj za 1 broj ukupnih rješenja; } while checkrows(changes); } while checkcolumns(changes); }while checkblocks(changes);
11
ako je zadano da pretražujemo nasumično, ispermutiraj listofvalues.
bestposition = mjesto u tablici za koje postoji najmanje mogućih vrijednosti. broj rješenja = 0; kreiraj listu listofvalues i u nju upiši sve moguće vrijednosti za poziciju bestposition. ako je zadano da pretražujemo nasumično, ispermutiraj listofvalues. while(listofvalues nije prazna){ - int current = vrijednost s početka liste valuelist; - makni tu vrijednost iz liste. - na poziciju bestposition postavi vrijednost current. - broj nađenih rješenja += solve(file, depth+1); - izbriši vrijednost koju smo postavili na bestposition. } poništi sve vrijednosti koje smo promijenili (tj izbriši sve brojeve koje smo upisivali, kako bi se backtracking mogao vratiti) vrati broj pronađenih rješenja; }; Predzadbja natuknica, prazno mjesto viška
12
Generiranje novih sudoku
Upišemo kanonski korijen u tablicu: pronađemo jedno rješenje gornje slagalice:
13
- nasumično ispermutiraj retke (unutar blok redaka)
- nasumično ispermutiraj stupce (unutar blok stupaca) - nasumično ispermutiraj blok retke - nasumično ispermutiraj blok stupce - nasumično ispermutiraj vrijednosti u tablici - na slučajan način generiraj vektor order[81], koji nam govori kojim redoslijedom ćemo uklanjati vrijednosti iz tablice for(i=0; i<81; i++){ -obriši vrijednost s pozicije order [i]; -provjeri je li rješenje jedinstveno, ako nije, vrati vrijednost na poziciju order [i]; } s pozicije, a ne sa
14
lijevo je permutiranje stupaca, a desno permutiranje blok-redaka
15
Zaključak: program generira sudoku u prosjeku za 0.046s
puno brže nego brute force
16
Literatura 1. http://web. math. hr/nastava/ui/
2. 3. 4. Veličina fonta u 1.
17
Najteži sudoku na svijetu...
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.