HexSudoku Checker

Nasjer

Mitglied
Hallo zusammen,

meine Aufgabe ist es einen Checker für ein hexadezimales Sudoku zu programmieren.

TestChecker dürfen wir nicht verändern.
Java:
class TestChecker {
	
	public static void main (String args []) {
		System.out.println(args.length);
		HexSudoku.Variante v = HexSudoku.Variante.normal;
		if (args.length > 0 && args[0].equals("-x"))
			v = HexSudoku.Variante.mitDiagonalen;
		HexSudoku s = new HexSudoku(v);

		s.read();
		s.write();
		
		if (!HexSudokuChecker.check(s))
			System.out.print("not ");
		System.out.println("ok");
	}
}


In HexSudoku soll das hexadezimale Sudoku eingegeben werden und zwar nach folgendem Muster:

01.3.567.9.bc.ef
4.67.1.3c..f8.ab
.9a.c.ef012.4.6.
.d.f.9...56.01.3
.0.2...69.b.d.f.
5.76.0.2d.f.9.ba
98....f.1.32....
..f.9.b.54....32
23..6.4.a.89...d
.7.52.01e.c.a.8.
.b8.ef.d2...6..5
e.cd..8.67.52.01
.2.076.4ba...edc
.6.4.2..fe...a98
..98.e.c3.10.654
.edc.a9.76.43.1.

Und bei write soll ein Rahmen um das Sudoku gemacht werden.
Java:
import java.util.StringTokenizer;

public class HexSudoku {

	public enum Variante { normal, mitDiagonalen };
	public Variante v;
	public HexSudoku s;
	private final static int konstante=15;

	/**
	 * Konstruktor von HexSudoku, der die beiden Varianten normal und mitDiagonale unterschiedlich behandelt
	 * @param v
	 */
	public HexSudoku(Variante v) { 
		switch (v) {
		case normal: 
			HexSudokuChecker checker= new HexSudokuChecker();
			read();
			read();
			HexSudokuChecker.check(s);
			write();
			break;
		case mitDiagonalen:
			HexSudokuChecker checker2= new HexSudokuChecker();
			read();
			HexSudokuChecker.check(s);
			HexSudokuChecker.checkDiagonal(s);
			write();
			break;
		}
	}


	public void read() {
		StringTokenizer tokenizer=new StringTokenizer(Keyboard.readString());
		while(tokenizer.hasMoreTokens()){
			String[] array=new String[15];
			array=tokenizer.nextToken();
			System.out.print(tokenizer.nextToken()+" ");
		}
	}

	public void write() {
		int[][]feld = null;
		for (int i = 0; i <konstante; ++i) {
			if (i % 4 == 0)
				System.out.println(" -----------------------");
			for (int j = 0; j <konstante; ++j) {
				if (j % 4 == 0) System.out.print("| ");
				System.out.print(feld[i][j] == 0 ? " " : Integer.toString(feld[i][j]));
				System.out.print(' ');
			}
			System.out.println("|");
		}
		System.out.println(" -----------------------");
	}
}

Noch nicht fertig geschrieben aber die Absicht ist hoffentlich zu erkennen.^^
Java:
public class HexSudokuChecker {
	public int[][] feld; // Sudoku Feld
	public int n, box_n;// Konstante fuer die Anzahl an Bloecken(16er Sudoku) und die Breite einer Box (4)

	public static boolean check(HexSudoku s) {
		return false;
	}

	/**
	 * Prueft ob der Wert bereits in der (horizontalen) SPALTE existiert
	 * @return-> Gibt true zurueck, wenn der Wert bereits existiert
	 */
	public boolean checkHorizontal(int j, int value) {
		for(int a=0; a<n; a++)
			if(feld[a][j] == value)
				return true;
		
		return false;
	}

	/**
	 * Prueft ob der Wert bereits in der (vertikalen) REIHE existiert
	 * @return-> Gibt true zurueck, wenn der Wert bereits existiert
	 */
	public boolean checkVertical(int i, int value) {
		for(int a=0; a<n; a++)
			if(feld[i][a] == value)
				return true;

		return false;
	}

	/**
	 * Prueft ob der Wert bereits in der BOX existiert
	 * @return-> Gibt true zurueck, wenn der Wert bereits existiert
	 */
	public boolean checkBox(int i, int j, int value) {
		// oberes, linkes Eck der Box herausfinden (2|8 zu 0|6)
		int i_start = (int)(i/box_n) * box_n;
		int j_start = (int)(j/box_n) * box_n;

		for(int a=i_start; a<i_start+box_n; a++)
			for(int b=j_start; b<j_start+box_n; b++)
				if(feld[a][b] == value)
					return true;
		return false;
	}

	/**
	 * Prueft ob der Wert bereits diagonal existiert
	 * @return-> Gibt true zurueck, wenn der Wert bereits existiert
	 */
	public static boolean checkDiagonal(HexSudoku s) {
		return false;
	}
}


Mein Problem ist nun aus dieser Eingabe die Punkte als leere Felder im Sudoku zu erkennen und dies dann auch gleich richtig in einem Array zu speichern:

01.3.567.9.bc.ef
4.67.1.3c..f8.ab
.9a.c.ef012.4.6.
.d.f.9...56.01.3
.0.2...69.b.d.f.
5.76.0.2d.f.9.ba
98....f.1.32....
..f.9.b.54....32
23..6.4.a.89...d
.7.52.01e.c.a.8.
.b8.ef.d2...6..5
e.cd..8.67.52.01
.2.076.4ba...edc
.6.4.2..fe...a98
..98.e.c3.10.654
.edc.a9.76.43.1.



Und bei write soll dann solch ein Feld als Ausgabe erzeugt werden, aber halt quadratisch:

Sudoku
+---------+---------+---------+---------+
| 0 1 3 | 5 6 7 | 9 b | c e f |
| 4 6 7 | 1 3 | c f | 8 a b |
| 9 a | c e f | 0 1 2 | 4 6 |
| d f | 9 | 5 6 | 0 1 3 |
+---------+---------+---------+---------+
| 0 2 | 6 | 9 b | d f |
| 5 7 6 | 0 2 | d f | 9 b a |
| 9 8 | f | 1 3 2 | |
| f | 9 b | 5 4 | 3 2 |
+---------+---------+---------+---------+
| 2 3 | 6 4 | a 8 9 | d |
| 7 5 | 2 0 1 | e c | a 8 |
| b 8 | e f d | 2 | 6 5 |
| e c d | 8 | 6 7 5 | 2 0 1 |
+---------+---------+---------+---------+
| 2 0 | 7 6 4 | b a | e d c |
| 6 4 | 2 | f e | a 9 8 |
| 9 8 | e c | 3 1 0 | 6 5 4 |
| e d c | a 9 | 7 6 4 | 3 1 |
+---------+---------+---------+---------+




Danke schon einmal im Voraus.
 

xehpuk

Top Contributor
Du könntest ja mal konkrete Fragen zu konkreten Problemen stellen. Dazu gehören natürlich deine Lösungsansätze.
 

bERt0r

Top Contributor
Nur mal soviel: Da du in hexadezimal 16 statt 9 verschieden Zahlen hast, wirst du das Sudoku wohl 4x4 aufbauen müssen, oder müssen nicht alle Zahlen vorkommen?
 

setsuna9

Mitglied
Irgendwie fehlt in der Methode [c]read()[/c], wo deine Strings gespeichert werden soll, anscheinend wohl in [c]HexSudoku.feld [/c], die du wohl in der [c]write()[/c]-Methode dann ausgibst.
 

bERt0r

Top Contributor
Ach dein Problem ist nur wie du die Ausgabe richtig formatierst oder wie? Das ist doch einfach, du musst ein paar leerzeichen mehr einfügen für deine leeren Stellen.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben