001    package de.hska.info1.backtracking.labyrinth;
002    
003    /**
004     * Wegsuche durch ein Labyrinth mit Backtracking.
005     * 
006     * @author Christian Pape
007     */
008    public class Labyrinth {
009    
010            private char [] [] labyrinth;
011            
012            private int ausgangX;
013            
014            private int ausgangY;
015    
016            public Labyrinth(char [] [] labyrinth, int ausgangX, int ausgangY) {
017                    this.labyrinth = labyrinth;
018                    this.ausgangX = ausgangX;
019                    this.ausgangY = ausgangY;
020            }
021    
022            public boolean sucheAusgang(int x, int y) {
023                    labyrinth[y][x] = '.';
024                    if (! (ausgangX == x && ausgangY == y)) {
025                            for (int i = 0; i < 4; i++) {
026                                    int neuesX = x;
027                                    int neuesY = y;
028                                    switch (i) {
029                                    case 0: neuesY = y - 1;
030                                                    break;
031                                    case 1: neuesX = x + 1;
032                                                    break;
033                                    case 2: neuesY = y + 1;
034                                                    break;
035                                    case 3: neuesX = x - 1;
036                                                    break;
037                                    }
038                                    if (isSchrittSinnvoll(neuesX, neuesY)) {
039                                            if (sucheAusgang(neuesX, neuesY)) {
040                                                    return true;
041                                            } else {        
042                                                    labyrinth[neuesY][neuesX] = '-';                                        
043                                            }
044                                    }
045                            }
046                            return false;
047                    } else {
048                            return true;
049                    }
050            }
051      
052            private boolean isSchrittSinnvoll(int neuesX, int neuesY) {
053                    return 0 <= neuesY && neuesY < labyrinth.length
054                            && 0 <= neuesX && neuesX < labyrinth[neuesY].length
055                            && labyrinth[neuesY][neuesX] == ' ';
056            }
057            
058            public void print() {
059                    for (int y = 0; y < labyrinth.length; y++) {
060                for (int x = 0; x < labyrinth[y].length; x++) {
061                                    System.out.print( labyrinth[y][x]);
062                            }
063                            System.out.println();
064                    }
065            }
066    }