⌛⌛ Sudoku

Tehtävään on tarjolla valmiina totetusta testaava luokka sekä testisyötetiedosto. Tiedostot saat käyttöösi nyhtämällä ne versionhallinnasta. Ne sijaitsevat repositoriossa student_template_project. Koodit nyhtääksesi student_template_project tulee laittaa paikalliseen repositorioosi remoteksi. Remote asetetaan:

  1. kloonaa oma tietovarastosi, jos sitä et ole vielä kloonannut

  2. siirry omaan paikalliseen tietovarastoosi

  3. lisää kurssin tietovarasto siellä remoteksi esim. git remote add course-upstream git@course-gitlab.tuni.fi:compcs140-fall2022/student_template_project.git Huom! Nimeä remote itsellesi mielekkäästi. Remoten URL määräytyy sen mukaan, oletko asettanut GitLabiin SSH-avaimen käyttöön: https://, jos et käytä SSH-avainta ja git@, jos käytät.

  4. nouda kurssin etätietovaraston versiohistoria ja yhdistä se omaasi, esim. git pull course-upstream main  --allow-unrelated-histories. Huom! Koska tietovarastoilla ei ole konfiguraatiosyistä yhteistä esi-isää, joudut antamaan merge-operaatiota varten --allow-unrelated-histories. Tietovarastojen yhdistämisen jälkeen muita toimenpiteitä ei pitäisi tarvita.

  5. huomaa, sinulla ei ole oikeuksia päivittää repositoriota, etkä tarvitse niitä.

Kahden tietovaraston käytöstä on materiaalia myös Ohjelmointi 2:lla.

Tässä harjoituksessa tarvitsemasi koodit ovat hakemistossa Round4/sudoku.

  • SudokuTest.java: valmis testiohjelma toteutuksesi testaamiseen

  • input.txt: testisyöte ohjelmalle

  • output.txt: esimerkkituloste, joka vastaa input.txt:tä

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 seuraavat julkiset ominaisuudet:

  • Parametriton rakennin Sudoku(), joka 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 olio ylläpitää ruudukon sisällään. Mutta 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 tule 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 3x3-kokoinen alilohko sisällä kahta keskenään samaa numeromerkkiä (tyhjiä ruutuja luonnollisesti saa olla monta).

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

      • Jos tarkituksen aikana löytyy kaksi samaa numeromerkkiä sisältävä rivi, sarake tai alilohko, otetaan talteen pienin numeromerkki c, joka esiintyi kaksi kertaa. Tämä yksikäsitteisyyden vuoksi, jos useampikin eri numeromerkki sattuisi esiintymään kaksi kertaa. 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 rivin 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, sekä tiedostossa output.txt annetun esimerkkitulosteen avulla. Aseta nämä tiedostot sekä oma luokkatoteutuksesi samaan hakemistoon, käännä ohjelma esim. tapaan javac *.java, ja suorita tapaan java SudokuTest input.txt. Suorituksen pitäisi tuottaa tiedostossa output.txt kuvattu tuloste.

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