⌛⌛ Sudoku

Tehtävään on tarjolla valmista materiaalia etätietovarastossa:

  • Materiaali on varaston hakemistossa round4/sudoku.

  • SudokuTest.java: valmis testiohjelma toteutuksesi testaamiseen.

  • input.txt: testisyöte ohjelmalle.

  • output.txt: esimerkkituloste, joka on luotu antamalla ohjelmalle input.txt-tiedoston syötteet.

Tehtävä: Sudoku

Aseta toteutuksesi tiedostoon Sudoku.java.

Toteuta luokka Sudoku, joka ylläpitää Sudoku-ruudukkoa ja osaa esimerkiksi tarkistaa sen laillisuuden. Jos olet onnistunut välttymään tietämästä, mikä Sudoku on, tutustu ensin vaikkapa Wikipedia-artikkeliin aiheesta.

Tarkemmin sanoen tehtävänä on toteuttaa luokka Sudoku, jolla on alla annetut julkiset piirteet. Alä tekee luokkaan muita julkisia piirteitä. Esimerkiksi apufunktioiden tulee olla kätkettyjä.

  • Parametriton rakennin Sudoku(): alustaa Sudoku-olion tallettamaan 9 × 9 -kokoisen Sudoku-ruudukon, jonka kaikki ruudut ovat tyhjiä (esitetty välilyöntimerkeillä ' ').

    • Voit sinänsä vapaasti päättää, millaisessa muodossa luokka ylläpitää ruudukkoa. Tässä tulee luonnollisesti huomioida alla kuvattujen jäsenfunktioiden ominaisuudet.

  • Jäsenfunktio set(int i, int j, char c): asettaa Sudoku-ruudukon rivin i sarakkeen j ruutuun merkin c.

    • Rivit numeroidaan 0…8 ja sarakkeet 0…8. Funktion tulee tarkistaa, että i ja j vastaavat laillista riviä ja saraketta. Ellei näin ole, tulostetaan muotoa “Trying to access illegal cell (i, j)!” oleva viesti.

    • Sudoku-ruudukkoon saa tallettaa ainoastaan välilyöntejä ' ' (tarkoittaa tyhjää ruutua) sekä numeromerkkejä '1', '2', '3', '4', '5', '6', '7', '8' ja '9'. Jos annettu merkki c on jokin muu merkki, ei sitä aseteta ja tulostetaan muotoa “Trying to set illegal character c to (i, j)!” oleva viesti.

  • Jäsenfunktio check(): tutkii, onko Sudoku-ruudukon nykyinen sisältö laillinen. Palauttaa true, jos on, ja muuten false.

    • Sudoku on laillinen, ellei mikään rivi, sarake tai 3 x 3 -kokoinen alilohko sisällä kahta tai useampaa keskenään samaa numeromerkkiä (tyhjiä ruutuja luonnollisesti saa olla monta).

      • Tarkista ensin rivit, sitten sarakkeet, ja lopuksi 3 x 3 lohkot vasemmasta yläkulmasta riveittäin edeten.

      • Jos rivin, sarakkeen tai lohkon tarkistuksen aikana löytyy useita toistuvia numeromerkkejä, otetaan näistä yksikäsitteisyyden vuoksi talteen pienin numeromerkki c. Tämän jälkeen tulostetaan jokin alla kuvatuista viesteistä ja tarkistus päättyy palauttaen arvon false. Tarkistus siis lopetetaan heti, kun ensimmäinen laiton kohta löytyy.

        • Rivi: “Row i has multiple c's!”, missä i on rivin indeksi.

        • Sarake: “Column j has multiple c's!”, missä j on sarakkeen indeksi.

        • Alilohko: “Block at (x, y) has multiple c's!”, missä x ja y ovat alilohkon vasemman yläkulman ruudun rivi ja sarake.

    • Jäsenfunktio print(): tulostaa Sudoku-ruudukon. Ruudukon rajat esitetään merkkien '#', '-', '|' ja '+' avulla ja ruudun arvon molemmin puolin on yksi välilyönti. Katso tarkempi muoto tehtävän yhteydessä annetusta esimerkkitulosteesta.

Toteutuksen testaus

Voit testata luokkaasi tiedostossa SudokuTest.java annetun valmiin testiohjelman, tiedostossa input.txt annetun testidatan ja tiedostossa output.txt annetun esimerkkitulosteen avulla. Aseta nämä tiedostot sekä oma luokkatoteutuksesi samaan hakemistoon, käännä ohjelma esimerkiksi komennolla javac *.java, ja suorita ohjelma komennolla java SudokuTest input.txt. Suorituksen pitäisi tuottaa tiedostossa output.txt kuvattu tuloste.

Palautus

Palauta Sudoku.java-tiedosto tuttuun tapaan Plussan kautta.

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.