2016-10-18 5 views
1

Also meine Aufgabe ist es, ein Labyrinth mit Stacks in Java zu lösen. Ich habe etwas Code, aber ich laufe immer wieder auf den gleichen Fehler, und ich bin mir nicht sicher, was schief läuft.lösen ein Labyrinth mit Stacks in Java

Dies ist mein Code:

/** 
* @author Zackie Nisar 
*/ 
import java.io.*; 
import java.util.*; 
/** 
    * Reads a file called maze.txt. 
    * In the file, a maze composed of @ signs, $ signs, periods, and hashtag exists. 
    * The @ sign is the beginning of the maze, the hashtags are the walls, the $ sign the end, and the periods ways to navigate through the maze. 
    * This program finds a way to navigate through that maze. 
    * If the text file doesn't exist, the program will quit and exit. 
    * @param args an array of strings which contains command-line arguments in Java 
    */ 

public class MazeSolver 
{ 
    private static char maze[][];  
    private static Stack<Character> stack = new Stack<Character>(); 
     public static void main(String[] args) 
     { 
       File textFile = new File("/c:/Temp/maze.txt"); 
       String line; 
       int row = 0; 
       try 
       { 
        FileReader fileReader = new FileReader(textFile); 
        BufferedReader bufferedReader = new BufferedReader(fileReader); 
        maze = new char[Integer.parseInt(bufferedReader.readLine())][Integer.parseInt(bufferedReader.readLine())]; 
        while ((line = bufferedReader.readLine()) != null) 
        { 
         maze[row] = line.toCharArray(); 
         row++; 
        } 
        process(1,1); 
       } 
       catch (FileNotFoundException e) 
       { 
        System.err.println("FileNotFound: " + e.getMessage()); 
       } 
       catch (IOException e) 
       { 
        System.err.println("IOException: " + e.getMessage()); 
       } 
     } 
     public static void process(int row, int column) 
     { 
       displayArray(); 
       System.out.println(row + ", " + column); 
       System.out.println("size is: " + stack.size() + "\n"); 
       if (maze[row][column] == '$') 
       { 
        displayStack(row,column); 
       } 
       else 
       { 
        if (maze[row - 1][column] == '.' && (stack.isEmpty() || stack.peek() != 'd')) 
        { 
         stack.push('u'); 
         process(row - 1,column); 
        } 
        else if (maze[row + 1][column] == '.' && (stack.isEmpty() || stack.peek() != 'u')) 
        { 
         stack.push('d'); 
         process(row + 1,column); 
        } 
        else if (maze[row][column + 1] == '.' && (stack.isEmpty() || stack.peek() != 'l')) 
        { 
         stack.push('r'); 
         process(row,column+1); 
        } 
        else if (maze[row][column - 1] == '.' && (stack.isEmpty() || stack.peek() != 'r')) 
        { 
         stack.push('l'); 
         process(row,column - 1); 
        } 
        else 
        { 
         backtrack(row,column); 
        } 
       }     
     } 

     public static void displayStack(int row,int column) 
     { 
       if (!stack.isEmpty()) 
       { 
        System.out.print("(" + row + ", " + column + ") "); 
        char temp = stack.pop(); 
        if (temp == 'd') 
        { 
         displayStack(row + 1,column); 
        } 
        else if (temp == 'u') 
        { 
         displayStack(row - 1,column); 
        } 
        else if (temp == 'l') 
        { 
         displayStack(row,column + 1); 
        } 
        else 
        { 
         displayStack(row,column - 1); 
        } 
       }     
     } 

     public static void onlyOne(int row, int column, char pos) 
     { 
       boolean branch = false; 
       if (maze[row + 1][column] == ' ' && pos != 'u') 
       { 
         branch = true; 
       } 
       else if (maze[row - 1][column] == ' ' && pos != 'd') 
       { 
         branch = true; 
       } 
       else if (maze[row][column + 1] == ' ' && pos != 'l') 
       { 
         branch = true; 
       } 
       else if (maze[row][column - 1] == ' ' && pos != 'r') 
       { 
         branch = true; 
       } 
       else if (!branch) 
       { 
        // destroys backtracked location as there was only one exit 
        System.out.println("terminating : " + row + "," + column + " size of stack is: " + stack.size()); 
        maze[row][column] = '#'; 
       }     
     } 


     public static void backtrack(int row, int column) 
     { 
       if (!stack.isEmpty()) 
       { 
        char temp = stack.pop(); 
        onlyOne(row,column,temp); 
        if (temp == 'u') 
        { 
         process(row + 1,column); 
        } 
        else if (temp == 'd') 
        { 
         process(row - 1,column); 
        } 
        else if (temp == 'l') 
        { 
         process(row,column + 1); 
        } 
        else if (temp == 'r') 
        { 
         process(row,column - 1); 
        } 
       } 
       else 
       { 
        System.out.print("Maze has no solution."); 
       } 
     } 

     public static void displayArray() 
     { 
       for (int x = 0; x < maze.length; x++) 
       { 
         for (int y = 0; y < maze[x].length; y++) 
         { 
           System.out.print(maze[x][y]); 
         } 
         System.out.println(); 
       } 
       System.out.println(); 
     } 

} 





/* 
MY MAZE 
@ = START 
$ = END 
# = WALLS 
. = PATH 
# # # # # # # # # # # # 
# . . . # . . . . . . # 
@ . # . # . # # # # . # 
# # # . # . . . . # . # 
# . . . . # # # . # . $ 
# # # # . # . # . # . # 
# . . # . # . # . # . # 
# # . # . # . # . # . # 
# . . . . . . . . # . # 
# # # # # # . # # # . # 
# . . . . . . # . . . # 
# # # # # # # # # # # # 
*/ 

Und ich halte den gleichen Fehler:

Exception in thread "main" java.lang.NumberFormatException: For input string: "# # # # # # # # # # # #" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at MazeSolver.main(MazeSolver.java:28) 

Einige Hilfe und Anleitung würde geschätzt.

+0

Der Fehler ist klar, es heißt, dass Sie bei Zeile '28' versuchen, eine' Zeichenfolge' zu ​​konvertieren, die nicht in 'Nummer' umgewandelt werden kann. Überprüfen Sie also in den ersten Zeilen Ihrer Textdatei, welche in Integer konvertiert werden -> maze = new char [Integer.parseInt (bufferedReader.readLine())] [Integer.parseInt (bufferedReader.readLine())]; – GOXR3PLUS

+0

Was meinst du mit Scheck? –

+0

Ich meine, einen Blick in die Datei 'Maze.txt' zu werfen, um zu sehen, was 2 erste Zeilen enthalten. – GOXR3PLUS

Antwort

1

Sie haben Sie String "# # # # # # # # # # # #" eingeben und dann versuchen, es für einen int Wert zu analysieren. Integer.parseInt kann nur String parsen, enthält Zahlen - Ganzzahlen, es kann nicht andere Symbole durch seine Zahl in ASCII konvertieren.