Posted by audun Wed 7th Mar 2007 20:06 - Syntax is JavaScript - 212 views
Download | New Post | Modify | Show line numbers
Download | New Post | Modify | Show line numbers
//
// Sudoku.java
//
//
// Created by Audun Ask Blaker on 26.02.07.
// Copyright 2007 Audun Ask Blaker. All rights reserved.
//
import easyIO.*;
import java.util.*;
/********************************************
* ** Class Sudoku/ Main ** *
********************************************/
public class Sudoku {
public static void main(String[] args) {
System.out.println("**_* SuDoKu *_** \n");
String fnavn = "";
// Sjekker om vi har fÂtt med et filnavn fra terminal/bruker / pr¯ver  sette fnavn lik dette.
try {
fnavn = args[0];
}
// Hvis vi fÂr en outofboundsexeption vil denne bli fanget opp og erstattet med en eminent Feilmelding.
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("FEIL: Du m taste inn et filnavn. " + "f.eks: java Sudoku sudokuoppgave3.txt");
} // Slutt catch
if (!fnavn.contains(".txt")) {
System.out.println("Nei nei nei... du m nok bruke en .txt fil gitt.");
} else {
Kontroll ktrl = new Kontroll();
ktrl.gogo(fnavn);
}
} // Slutt main
} // Slutt Sudoku
/*********************************************
* ** Utsyn/ View ** *
**********************************************/
class Utsyn {
Out skjerm;
// Konstrukt¯r til Utsyn
Utsyn() {
skjerm = new Out();
} // Slutt utsyn
// Utskriftsmetode
void skriv(String tilskjerm) {
System.out.print(tilskjerm);
} // Slutt skriv
void skriv(int tall) {
System.out.print(tall);
System.out.print(" ");
}
void skriv(char abc) {
System.out.print(abc);
System.out.print(" ");
}
} // Slutt class Utsyn
/*********************************************
* ** Kontroll ** *
**********************************************/
class Kontroll {
Utsyn utsynet;
In tast;
Brett brett;
int[][] ruter;
Kontroll() {
utsynet = new Utsyn();
tast = new In();
} // Slutt Kontroll()
// F¯rste skritt mot  l¯se oppgaven. Innlesning og klargj¯ring. Oppretter rutenettverket og lager et brett av det.
// for s  starte det rekursive kallet i den f¯rste ruta (rute).
void gogo(String fnavn) {
In innfil = new In(fnavn);
int kvdr = innfil.inInt();
int boksRad = innfil.inInt();
int boksKol = innfil.inInt();
innfil.skipWhite();
int[][] ruter = new int[kvdr][kvdr];
String sjekk = "Filnavn: " + fnavn + "\nBrettst¯rrelse: " + kvdr +
"\nRader pr. boks: " + boksRad + "\nKolonner pr. boks: " + boksKol + "\n\nBrettet ser slik ut : \n";
utsynet.skriv(sjekk);
for(int i = 0; i < kvdr; i++) {
for(int j = 0; j < kvdr; j++) {
char rute = innfil.inChar();
int verdi = (int) rute;
innfil.skipWhite();
if(verdi == 46) { // Hvis verdien er ./0
ruter[i][j] = 0;
utsynet.skriv(ruter[i][j]);
} else if (verdi >= 49 && verdi <= 57) { // Hvis verdien er 0-9
ruter[i][j] = (verdi - 48);
utsynet.skriv(ruter[i][j]);
} else if (verdi >= 65 && verdi <= 91) { // Hvis verdien er 10-36
ruter[i][j] = (verdi - 55);
utsynet.skriv(ruter[i][j]);
}
} utsynet.skriv("\n"); // Linjeskift // Slutt f¯rste for
} utsynet.skriv("\n"); // Linjeskift // Slutt andre for
// Etter  ha lest inn og satt riktige verdier opprettes ett brett med de innleste verdiene
brett = new Brett(kvdr, boksRad, boksKol, ruter);
// SÂ settes den rekursive metoden i gang i rute (0,0) (¯verst til venstre)
Rute rut = brett.getRute(0,0);
rut.pr0vAlleSifferMegOgResten(0,0);
} // Slutt gogo()
} // Slutt
/********************************
* Brett *
* Skal holde p all informasjon *
* om det innleste brettet *
********************************/
class Brett {
int kvdr; // St¯rrelsen p brettet
int boksRad; // Antall rader pr boks
int boksKol; // Antall kolonner pr boks
Rute[][] alleRuter; // 2d array som holder p alle rute-objektene i et Brett
SuperKlasse[] kolonner; //array som holder p alle kolonne-objektene
SuperKlasse[] rader; // array som holder p alle rad-objektene
SuperKlasse[] bokser; // array som holder p alle boks-objektene
Utsyn utsynet = new Utsyn();;
int antallL0sninger = 0;
Brett(int kvdr, int boksRad, int boksKol, int[][] ruter) {
this.kvdr = kvdr;
this.boksRad = boksRad;
this.boksKol = boksKol;
alleRuter = new Rute[kvdr][kvdr];
kolonner = new Kolonne[kvdr];
rader = new Rad[kvdr];
bokser = new Boks[kvdr];
// Jobber seg gjennom brettet og lager arrayer for kolonner, rader og bokser
for(int i = 0; i < kvdr; i++) {
kolonner[i] = new Kolonne(i, kvdr);
rader[i] = new Rad(i, kvdr);
bokser[i] = new Boks(i, kvdr);
}
int nr = 0;
for(int i = 0; i < kvdr; i++) {
for(int j = 0; j < kvdr; j++) {
// Regnestykke som gj¯r at vi finner hvilken boks en rute ligger i, gitt
// st¯rrelse p brettet, antall rader og kolonner og hvilket nummer ruten er i
// rekkef¯lgen p brettet
int a = ((nr/(boksRad * kvdr)) * boksRad);
int c = (nr / kvdr);
int d = (nr - (c * kvdr));
int boks = (d / boksKol) + a;
alleRuter[i][j] = new Rute(ruter[i][j], i, j, boks, nr, kvdr);
kolonner[j].leggTilRute(alleRuter[i][j]);
rader[i].leggTilRute(alleRuter[i][j]);
bokser[boks].leggTilRute(alleRuter[i][j]);
nr++;
} // Slutt f¯rste for
} // Slutt andre for
alleRuter[0][0].settBrett(this);
} // Slutt konstrukt¯r
Rute getRute(int rad, int kol) {
return alleRuter[rad][kol];
}
void skrivBrett() {
antallL0sninger++;
utsynet.skriv("L¯sning nr: " + antallL0sninger + "\n");
for(int i = 0; i < kvdr; i++) {
for(int j = 0; j < kvdr; j++) {
int tall = alleRuter[i][j].getVerdi();
if(tall < 10) {
utsynet.skriv(tall);
} else {
tall = tall + 55;
char abc = (char) tall;
utsynet.skriv(abc);
}
} utsynet.skriv("\n");
} utsynet.skriv("\n");
}
}
/********************************
* RUTE *
* Skal holde p all informasjon *
* for hver enkelt rute *
********************************/
class Rute {
int verdi;
int rad;
int kol;
int nummer;
int boks;
int kvdr;
static Brett brett;
// Konstrukt¯r
Rute(int verdi, int rad, int kol, int boks, int nummer, int kvdr) {
this.verdi = verdi;
this.rad = rad;
this.kol = kol;
this.nummer = nummer;
this.boks = boks;
this.kvdr = kvdr;
} // Slutt konstrukt¯r
int getVerdi() {
return verdi;
}
int getNummer() {
return nummer;
}
void setVerdi(int n) {
verdi = n;
}
// Mottar en peker til et brett-objekt, og setter pekeren brett til  peke p det. angir rutens tilh¯righet
void settBrett(Brett b) {
brett = b;
}
void pr0vAlleSifferMegOgResten(int x, int y) {
boolean ferdig = false;
// GÂr ett skritt til h¯yre
y++;
// Hvis vi har kommet til h¯yresiden av brettet
if(y == kvdr) {
y = 0; // S skal vi begynne p venstresiden igjen
x++; // men n skal vi ned en kolonne
// Hvis vi er kommet til bunn av brettet
if (x == kvdr) {
// Så er vi endelig ferdig :)
ferdig = true;
}
}
if(verdi == 0) { // I dette tilfellet har vi en tom rute, som da trenger en ny verdi.
for(int i = 1; i <= kvdr; i++) { // Vi pr¯ver da med verdier f.o.m 1 - t.o.m st¯rrelsen p brettet
if (!brett.bokser[boks].finnesFraF0r(i) && // Hvis verdien ikke finnes fra f¯r i den aktuelle boksen
!brett.kolonner[kol].finnesFraF0r(i) && // - .. - kolonna
!brett.rader[rad].finnesFraF0r(i)) { // -- .. -- raden
setVerdi(i); // SÂ skal rutas verdi settes til den verdien vi snakker om (i for l¯kka)
if(ferdig) {
brett.skrivBrett();
ferdig = false;
} else {
brett.getRute(x, y).pr0vAlleSifferMegOgResten(x, y);
}
}
}
setVerdi(0); // For at den rekursive metoden skal virke, m vi sette verdien p ruta til null igjen
// fordi at hvis "en vei" ikke gÂr greit, s m vi kunne endre verdien p ruta. Og det kan
// vi bare hvis verdien er null. (if(verdi == 0)).
} else {
if(ferdig) {
brett.skrivBrett();
ferdig = false;
} else {
brett.getRute(x, y).pr0vAlleSifferMegOgResten(x, y);
}
}
}
}
/*****************************
* SUPERKLASSEN *
* Inneholder alle variabler *
* de tre subklassene *
* Rad, Kolonne og Boks deler *
*****************************/
class SuperKlasse {
int nr;
int str;
HashMap ruter;
//Konstruktør
SuperKlasse(int nr, int str) {
this.nr = nr;
this.str = str;
ruter = new HashMap ();
} // Slutt konstruktør
void leggTilRute(Rute r) {
String nummer = r.getNummer() + "";
ruter.put(nummer, r);
}
boolean finnesFraF0r(int verdi) {
boolean finnes = false;
for(Rute r: ruter.values()) {
if(r.getVerdi() == verdi) {
finnes = true;
}
}
return finnes;
}
} // end class Brett
//Klassen boks er bare en kopi av klassen SuperKlasse
class Boks extends SuperKlasse {
Boks(int nr, int kvdr) {
super(nr, kvdr);
}
} // End class Boks
//Klassen Rad er bare en kopi av klassen Superklasse
class Rad extends SuperKlasse {
Rad(int nr, int kvdr) {
super(nr, kvdr);
}
} // End class Rad
//Klassen Rad er bare en kopi av klassen SuperKlasse
class Kolonne extends SuperKlasse {
Kolonne(int nr, int kvdr) {
super(nr, kvdr);
}
}
// Sudoku.java
//
//
// Created by Audun Ask Blaker on 26.02.07.
// Copyright 2007 Audun Ask Blaker. All rights reserved.
//
import easyIO.*;
import java.util.*;
/********************************************
* ** Class Sudoku/ Main ** *
********************************************/
public class Sudoku {
public static void main(String[] args) {
System.out.println("**_* SuDoKu *_** \n");
String fnavn = "";
// Sjekker om vi har fÂtt med et filnavn fra terminal/bruker / pr¯ver  sette fnavn lik dette.
try {
fnavn = args[0];
}
// Hvis vi fÂr en outofboundsexeption vil denne bli fanget opp og erstattet med en eminent Feilmelding.
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("FEIL: Du m taste inn et filnavn. " + "f.eks: java Sudoku sudokuoppgave3.txt");
} // Slutt catch
if (!fnavn.contains(".txt")) {
System.out.println("Nei nei nei... du m nok bruke en .txt fil gitt.");
} else {
Kontroll ktrl = new Kontroll();
ktrl.gogo(fnavn);
}
} // Slutt main
} // Slutt Sudoku
/*********************************************
* ** Utsyn/ View ** *
**********************************************/
class Utsyn {
Out skjerm;
// Konstrukt¯r til Utsyn
Utsyn() {
skjerm = new Out();
} // Slutt utsyn
// Utskriftsmetode
void skriv(String tilskjerm) {
System.out.print(tilskjerm);
} // Slutt skriv
void skriv(int tall) {
System.out.print(tall);
System.out.print(" ");
}
void skriv(char abc) {
System.out.print(abc);
System.out.print(" ");
}
} // Slutt class Utsyn
/*********************************************
* ** Kontroll ** *
**********************************************/
class Kontroll {
Utsyn utsynet;
In tast;
Brett brett;
int[][] ruter;
Kontroll() {
utsynet = new Utsyn();
tast = new In();
} // Slutt Kontroll()
// F¯rste skritt mot  l¯se oppgaven. Innlesning og klargj¯ring. Oppretter rutenettverket og lager et brett av det.
// for s  starte det rekursive kallet i den f¯rste ruta (rute).
void gogo(String fnavn) {
In innfil = new In(fnavn);
int kvdr = innfil.inInt();
int boksRad = innfil.inInt();
int boksKol = innfil.inInt();
innfil.skipWhite();
int[][] ruter = new int[kvdr][kvdr];
String sjekk = "Filnavn: " + fnavn + "\nBrettst¯rrelse: " + kvdr +
"\nRader pr. boks: " + boksRad + "\nKolonner pr. boks: " + boksKol + "\n\nBrettet ser slik ut : \n";
utsynet.skriv(sjekk);
for(int i = 0; i < kvdr; i++) {
for(int j = 0; j < kvdr; j++) {
char rute = innfil.inChar();
int verdi = (int) rute;
innfil.skipWhite();
if(verdi == 46) { // Hvis verdien er ./0
ruter[i][j] = 0;
utsynet.skriv(ruter[i][j]);
} else if (verdi >= 49 && verdi <= 57) { // Hvis verdien er 0-9
ruter[i][j] = (verdi - 48);
utsynet.skriv(ruter[i][j]);
} else if (verdi >= 65 && verdi <= 91) { // Hvis verdien er 10-36
ruter[i][j] = (verdi - 55);
utsynet.skriv(ruter[i][j]);
}
} utsynet.skriv("\n"); // Linjeskift // Slutt f¯rste for
} utsynet.skriv("\n"); // Linjeskift // Slutt andre for
// Etter  ha lest inn og satt riktige verdier opprettes ett brett med de innleste verdiene
brett = new Brett(kvdr, boksRad, boksKol, ruter);
// SÂ settes den rekursive metoden i gang i rute (0,0) (¯verst til venstre)
Rute rut = brett.getRute(0,0);
rut.pr0vAlleSifferMegOgResten(0,0);
} // Slutt gogo()
} // Slutt
/********************************
* Brett *
* Skal holde p all informasjon *
* om det innleste brettet *
********************************/
class Brett {
int kvdr; // St¯rrelsen p brettet
int boksRad; // Antall rader pr boks
int boksKol; // Antall kolonner pr boks
Rute[][] alleRuter; // 2d array som holder p alle rute-objektene i et Brett
SuperKlasse[] kolonner; //array som holder p alle kolonne-objektene
SuperKlasse[] rader; // array som holder p alle rad-objektene
SuperKlasse[] bokser; // array som holder p alle boks-objektene
Utsyn utsynet = new Utsyn();;
int antallL0sninger = 0;
Brett(int kvdr, int boksRad, int boksKol, int[][] ruter) {
this.kvdr = kvdr;
this.boksRad = boksRad;
this.boksKol = boksKol;
alleRuter = new Rute[kvdr][kvdr];
kolonner = new Kolonne[kvdr];
rader = new Rad[kvdr];
bokser = new Boks[kvdr];
// Jobber seg gjennom brettet og lager arrayer for kolonner, rader og bokser
for(int i = 0; i < kvdr; i++) {
kolonner[i] = new Kolonne(i, kvdr);
rader[i] = new Rad(i, kvdr);
bokser[i] = new Boks(i, kvdr);
}
int nr = 0;
for(int i = 0; i < kvdr; i++) {
for(int j = 0; j < kvdr; j++) {
// Regnestykke som gj¯r at vi finner hvilken boks en rute ligger i, gitt
// st¯rrelse p brettet, antall rader og kolonner og hvilket nummer ruten er i
// rekkef¯lgen p brettet
int a = ((nr/(boksRad * kvdr)) * boksRad);
int c = (nr / kvdr);
int d = (nr - (c * kvdr));
int boks = (d / boksKol) + a;
alleRuter[i][j] = new Rute(ruter[i][j], i, j, boks, nr, kvdr);
kolonner[j].leggTilRute(alleRuter[i][j]);
rader[i].leggTilRute(alleRuter[i][j]);
bokser[boks].leggTilRute(alleRuter[i][j]);
nr++;
} // Slutt f¯rste for
} // Slutt andre for
alleRuter[0][0].settBrett(this);
} // Slutt konstrukt¯r
Rute getRute(int rad, int kol) {
return alleRuter[rad][kol];
}
void skrivBrett() {
antallL0sninger++;
utsynet.skriv("L¯sning nr: " + antallL0sninger + "\n");
for(int i = 0; i < kvdr; i++) {
for(int j = 0; j < kvdr; j++) {
int tall = alleRuter[i][j].getVerdi();
if(tall < 10) {
utsynet.skriv(tall);
} else {
tall = tall + 55;
char abc = (char) tall;
utsynet.skriv(abc);
}
} utsynet.skriv("\n");
} utsynet.skriv("\n");
}
}
/********************************
* RUTE *
* Skal holde p all informasjon *
* for hver enkelt rute *
********************************/
class Rute {
int verdi;
int rad;
int kol;
int nummer;
int boks;
int kvdr;
static Brett brett;
// Konstrukt¯r
Rute(int verdi, int rad, int kol, int boks, int nummer, int kvdr) {
this.verdi = verdi;
this.rad = rad;
this.kol = kol;
this.nummer = nummer;
this.boks = boks;
this.kvdr = kvdr;
} // Slutt konstrukt¯r
int getVerdi() {
return verdi;
}
int getNummer() {
return nummer;
}
void setVerdi(int n) {
verdi = n;
}
// Mottar en peker til et brett-objekt, og setter pekeren brett til  peke p det. angir rutens tilh¯righet
void settBrett(Brett b) {
brett = b;
}
void pr0vAlleSifferMegOgResten(int x, int y) {
boolean ferdig = false;
// GÂr ett skritt til h¯yre
y++;
// Hvis vi har kommet til h¯yresiden av brettet
if(y == kvdr) {
y = 0; // S skal vi begynne p venstresiden igjen
x++; // men n skal vi ned en kolonne
// Hvis vi er kommet til bunn av brettet
if (x == kvdr) {
// Så er vi endelig ferdig :)
ferdig = true;
}
}
if(verdi == 0) { // I dette tilfellet har vi en tom rute, som da trenger en ny verdi.
for(int i = 1; i <= kvdr; i++) { // Vi pr¯ver da med verdier f.o.m 1 - t.o.m st¯rrelsen p brettet
if (!brett.bokser[boks].finnesFraF0r(i) && // Hvis verdien ikke finnes fra f¯r i den aktuelle boksen
!brett.kolonner[kol].finnesFraF0r(i) && // - .. - kolonna
!brett.rader[rad].finnesFraF0r(i)) { // -- .. -- raden
setVerdi(i); // SÂ skal rutas verdi settes til den verdien vi snakker om (i for l¯kka)
if(ferdig) {
brett.skrivBrett();
ferdig = false;
} else {
brett.getRute(x, y).pr0vAlleSifferMegOgResten(x, y);
}
}
}
setVerdi(0); // For at den rekursive metoden skal virke, m vi sette verdien p ruta til null igjen
// fordi at hvis "en vei" ikke gÂr greit, s m vi kunne endre verdien p ruta. Og det kan
// vi bare hvis verdien er null. (if(verdi == 0)).
} else {
if(ferdig) {
brett.skrivBrett();
ferdig = false;
} else {
brett.getRute(x, y).pr0vAlleSifferMegOgResten(x, y);
}
}
}
}
/*****************************
* SUPERKLASSEN *
* Inneholder alle variabler *
* de tre subklassene *
* Rad, Kolonne og Boks deler *
*****************************/
class SuperKlasse {
int nr;
int str;
HashMap
//Konstruktør
SuperKlasse(int nr, int str) {
this.nr = nr;
this.str = str;
ruter = new HashMap
} // Slutt konstruktør
void leggTilRute(Rute r) {
String nummer = r.getNummer() + "";
ruter.put(nummer, r);
}
boolean finnesFraF0r(int verdi) {
boolean finnes = false;
for(Rute r: ruter.values()) {
if(r.getVerdi() == verdi) {
finnes = true;
}
}
return finnes;
}
} // end class Brett
//Klassen boks er bare en kopi av klassen SuperKlasse
class Boks extends SuperKlasse {
Boks(int nr, int kvdr) {
super(nr, kvdr);
}
} // End class Boks
//Klassen Rad er bare en kopi av klassen Superklasse
class Rad extends SuperKlasse {
Rad(int nr, int kvdr) {
super(nr, kvdr);
}
} // End class Rad
//Klassen Rad er bare en kopi av klassen SuperKlasse
class Kolonne extends SuperKlasse {
Kolonne(int nr, int kvdr) {
super(nr, kvdr);
}
}
PermaLink to this entry https://pastebin.co.uk/11534
Posted by audun Wed 7th Mar 2007 20:06 - Syntax is JavaScript - 212 views
Download | New Post | Modify | Show line numbers
Download | New Post | Modify | Show line numbers
Comments: 0