source: Java_Quellcode_SOOP_Vorlesung/arrays/SudokuHelper.java @ 187

Last change on this file since 187 was 187, checked in by tr, 9 years ago

Aufräumarbeiten

File size: 2.7 KB
Line 
1package eu.hsrw.tr.prog.vl.arrays;
2
3/**
4 * Hilfsfunktionen für die SudokuSolver
5 * @author Thomas Richter
6 *
7 */
8public class SudokuHelper {
9    protected static long loopCount = 0;
10   
11    /**
12     * Testet, ob die Zahl an der Stelle ohne Verletzung der Sudokubedingung
13     * eingefügt werden kann. Die Methode kombiniert die Suche in Zeile, Spalte
14     * und Block in nur einer Schleife.
15     *
16     * @param a
17     *            9x9 Array mit dem Sudoku
18     * @param zeile
19     *            Zeile der zu prüfenden Zelle
20     * @param spalte
21     *            Spalte der zu prüfenden Zelle
22     * @param zahl
23     *            Kandidat für die Einfügung
24     * @return false, falls die Kandidatenzahl die Sudkobedingung verletzt,
25     *         sonst true
26     */
27    public static boolean kandidatOK(int[][] a, int zeile, int spalte, int zahl) {
28        // Feststellen in welchem Block wir eigentlich sind -> wir benötigen die
29        // kleinste Zeile und die kleinste Spalte dieses Blocks als Offset
30        int offsetZ = (zeile / 3) * 3;
31        int offsetS = (spalte / 3) * 3;
32       
33        for (int i = 0; i < a.length; i++) {
34            loopCount++;
35           
36            // teste Zeile, Spalte, Block
37            if (Math.abs(a[zeile][i]) == zahl
38                || Math.abs(a[i][spalte]) == zahl
39                || Math.abs(a[offsetZ + i / 3][offsetS + i % 3]) == zahl) {
40               
41                return false;
42            }
43        }
44        return true;       
45    }
46   
47    /**
48     * Initialisiert ein Sudoku als Array aus einem String mit 81 Zeichen.
49     *
50     * @param s
51     *            Das Sudoku in reduzierter Form: 81 Zeichen, zeilenweise von
52     *            oben links nach unten rechts.
53     * @return Array, in dem die Vorbelegungen als negative Werte eingetragen
54     *         sind.
55     */
56    public static int[][] parseSudokuString(String sudokuKanonisch) {
57        int[][] a = new int[9][9];
58        // Eingabe in ein Array von Zeichen umwandeln
59        char[] zeichen = sudokuKanonisch.toCharArray();
60
61        for (int z = 0; z < a.length; z++) {
62            for (int s = 0; s < a[z].length; s++) {
63                // Um die tatsächliche Ziffer zu bekommen wird jeweils der
64                // ASCII-Code des Zeichens '0' abgezogen.
65                // Der Index wird aus der aktuellen Zeile und Spalte errechnet.
66                a[z][s] = -1 * (zeichen[z * a.length + s] - (int) '0');
67            }
68        }
69
70        return a;
71    }
72   
73    /**
74     * Gibt ein Sudoku formatiert auf der Konsole aus
75     *
76     * @param a
77     *            Array, in dem das auszugebende Sudiku gespeichert ist
78     */
79    public static void printSudoku(int[][] a) {
80        System.out.println("\n-------------------------");
81       
82        for (int i = 0; i < a.length; i++) {
83            System.out.print("| ");
84
85            for (int j = 0; j < a[i].length; j++) {
86
87                System.out.print(Math.abs(a[i][j]));
88
89                if (j % 3 == 2) {
90                    System.out.print(" | ");
91                } else {
92                    System.out.print(" ");                 
93                }
94            }
95            if (i % 3 == 2) {
96                System.out.print("\n-------------------------");
97            }
98            System.out.println();
99        }
100    }   
101}
Note: See TracBrowser for help on using the repository browser.