Changeset 396 in Java_Quellcode_SOOP_Vorlesung


Ignore:
Timestamp:
Dec 4, 2017, 9:21:38 PM (7 years ago)
Author:
tr
Message:

diverse Anpassungen von Kommentaren

Files:
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • arrays/ArraysVL.java

    r390 r396  
    11package eu.hsrw.tr.prog.vl.arrays;
    22
    3 public class Arrays {
     3import java.util.Arrays;
     4
     5public class ArraysVL {
    46   
    57    public static void main(String[] args) {
     
    5557        }
    5658   
     59        // Alternativ:
     60        Arrays.fill(prim, true);
     61
    5762        // Vielfache der Primzahlen streichen, beginne bei 2
    5863        for (int i = 2; i < prim.length; i++) {
  • rekursion/Rekursion.java

    r188 r396  
    2929     * Berechnet rekursiv n!
    3030     * @param n n
    31      * @return
     31     * @return n!
    3232     */
    3333    public static int fakultaet(int n) {
     
    4141     * Berechnet rekursiv 2^n
    4242     * @param n n
    43      * @return
     43     * @return 2^n
    4444     */
    4545    public static int zweihoch(int n) {
  • rekursion/SudokuSolverRekursiv.java

    r245 r396  
    4444    }
    4545
     46    private static int aufrufe = 0;
     47   
    4648    /**
    4749     * Löst das übergebene 9x9 Sudoku mittels Brute Force und Backtracking: Es
    48      * wird mit dem Feld oben links begonnen und dann spalten- und zeilenweise
     50     * wird mit dem Feld oben links begonnen und dann rekursiv spalten- und zeilenweise
    4951     * nach rechts unten gearbeitet. Als erster Wert wird die 1 versucht. Falls
    5052     * der Versuch einen Konflikt auslöst, wird die Zahl immer weiter erhöht,
    51      * bis entweder kein Konflikt mehr auftritt oder die Zahl 10 erreicht wurde.
    52      * Falls 10 erreicht wurde konnte kein passender Eintrag gefunden werden,
    53      * das Problem muss also schon weiter vorn liegen. Es wird um ein Feld
    54      * zurückgegangen und dort die nächsthöhere Zahl versucht. Ggf. sind sehr
    55      * viele Rücksprünge erforderlich, da viele Kombinationen durchprobiert
    56      * werden müssen.
     53     * bis entweder kein Konflikt mehr auftritt oder die Zahl 9 überschritten
     54     * wurde. Falls 9 überschritten wurde, konnte kein passender Eintrag
     55     * gefunden werden, das Problem muss also schon weiter vorn liegen. Es wird
     56     * um ein Feld zurückgegangen und dort die nächsthöhere Zahl versucht. Ggf.
     57     * sind sehr viele Rücksprünge erforderlich, da viele Kombinationen
     58     * durchprobiert werden müssen.
    5759     *
    5860     * @param a
    5961     *            zu lösendes Sudoku als 9x9 Array
     62     * @param position
     63     *            Index des aktuellen Feldes
     64     *
     65     * @return Indikator, ob eine gültige Einfügung in das Feld gefunden wurde.
     66     *
    6067     */
    61     public static boolean solve(int[][] a, int feld) {
     68    public static boolean solve(int[][] a, int position) {
     69        aufrufe++;
     70       
    6271        // sind wir fertig?
    63         if (feld == 81) {
     72        if (position == 81) {
    6473            return true;
    6574        }
    66        
    67         int zeile = feld / 9;
    68         int spalte = feld % 9;
    69        
    70         // ist das Feld vorbelegt?
     75
     76        // Zeile und Spalte aus dem Index der aktuellen Position berechnen
     77        int zeile = position / 9;
     78        int spalte = position % 9;
     79
     80        // ist das Feld an der aktuellen Position vorbelegt?
    7181        if (a[zeile][spalte] != 0) {
    72             return solve(a, feld + 1);
     82            // gehe zum nächsten Feld
     83            return solve(a, position + 1);
    7384        }
    74        
    75         // Zahl testen
     85
     86        // Zahlen von 1 bis 9 testen: Konnte eingefügt werden, wird rekursiv die
     87        // nächste Position angesprungen
    7688        for (int kandidat = 1; kandidat <= 9; kandidat++) {
    7789            if (kandidatOK(a, zeile, spalte, kandidat)) {
     90                // Zahl an Position einfügen
    7891                a[zeile][spalte] = kandidat;
    79                 if (solve(a, feld + 1)) {
     92                // Rekursiver Aufruf mit nächster Position
     93                if (solve(a, position + 1)) {
     94                    // Wir geben ein erhaltenes true weiter nach oben
    8095                    return true;
    8196                }
    82             }   
     97            }
    8398        }
    84        
    85         // keine Zahl hat gepasst
    86         // aktuelle Zelle nullen und zurückspringen
     99
     100        // keine Zahl hat gepasst: Feld an der aktuellen Position nullen und
     101        // zurückspringen.
     102        // Durch den rekursiven Aufruf dieser Methode kehrt return einen Schritt
     103        // nach oben zurück. Dort war die Position noch um 1 kleiner, es wird
     104        // also nach vorn gegeangen.
    87105        a[zeile][spalte] = 0;
    88106        return false;
     
    150168
    151169        solve(sudoku, 0);
     170       
     171        printSudoku(sudoku);
    152172
    153         printSudoku(sudoku);
     173        System.out.println("Aufrufe: " + aufrufe);
    154174    }
    155175}
Note: See TracChangeset for help on using the changeset viewer.