2016-10-18 6 views
1

Итак, мое задание - решить лабиринт, используя стеки в Java. У меня есть код, но я все время сталкиваюсь с той же ошибкой, и я не уверен, что происходит не так.Решение лабиринта с использованием стеков в java

Это мой код:

/** 
* @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 
# # # # # # # # # # # # 
# . . . # . . . . . . # 
@ . # . # . # # # # . # 
# # # . # . . . . # . # 
# . . . . # # # . # . $ 
# # # # . # . # . # . # 
# . . # . # . # . # . # 
# # . # . # . # . # . # 
# . . . . . . . . # . # 
# # # # # # . # # # . # 
# . . . . . . # . . . # 
# # # # # # # # # # # # 
*/ 

И я получаю ту же ошибку:

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) 

Некоторую помощь и рекомендации будут оценены.

+0

Ошибка ясно, она говорит вам, что в строке '28' вы пытаетесь преобразовать' String', который не может быть преобразован в 'number'. Так что проверите в первых строках вашего текстового файла, которые преобразуются в Integer, используя -> maze = new char [Integer.parseInt (bufferedReader.readLine())] [Integer.parseInt (bufferedReader.readLine())]; – GOXR3PLUS

+0

Что вы подразумеваете под чеком? –

+0

Я хочу посмотреть в файле 'Maze.txt', чтобы увидеть, что содержит две первые строки. – GOXR3PLUS

ответ

1

У вас есть строка String "# # # # # # # # # # # #", а затем вы попытаетесь разобрать ее на значение int. Integer.parseInt может анализировать только String, содержит числа - целые числа, он не может преобразовать другие символы по его числу в ASCII.

 Смежные вопросы

  • Нет связанных вопросов^_^