2013-10-11 4 views
-1

****************** Я нашел проблему. Я поменял индекс изменений ... таким образом, я пошел вниз, а не над столбцом. Спасибо всем ***************************java головоломка solver ArrayIndexOutOfBoundsException

В настоящее время я работаю над решением для решения головоломки в Java. Вся программа работает, кроме фактической решающей части ... Я знаю тяжелую часть. Я сделал это рекурсивно. Я знаю, почему массив будет генерировать это исключение. PathChoices.java должен помешать ему когда-либо бросать его ..., кроме последней строки. Последняя строка не является проблемой. Прогрессирование идет от 1,1 до Вот вход:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
at Maze.board(Maze.java:34) 
at MazeSolver.mazeSolver(MazeSolver.java:38) 
at MazeSolver.mazeSolver(MazeSolver.java:65) 
at MazeSolver.mazeSolver(MazeSolver.java:65) 
at MazeSolver.mazeSolver(MazeSolver.java:43) 
at MazeSolver.mazeSolver(MazeSolver.java:43) 
at MazeSolver.mazeSolver(MazeSolver.java:32) 
at MazeSolver.mazeSolver(MazeSolver.java:43) 
at Maze.main(Maze.java:66) 

String input = " ___________________ \n" 
    + "|_ | ___  _ _|\n" 
    + "| | | _|___| |_ | |\n" 
    + "| _____|_ | _| |\n" 
    + "| | | _ | _|_ | |\n" 
    + "|___| | | | _ | | |\n" 
    + "| |_ | _____| | |_|\n" 
    + "| |___| | _| |_ |\n" 
    + "|  | |___ |_ | |\n" 
    + "|_| | | _ |_| |_| |\n" 
    + "|___|___|_______|___|\n" 

Где я пытаюсь решить эту проблему с левого верхнего к нижнему правому. Вот мои занятия:

import java.awt.Point; 
import java.util.Stack; 


public class Maze { 

    private char [][] myBoard; 
    private Point myLocation; 
    private Point boardSize; 
    private Stack<String> sol; 
    private MazeParser mp; 

    public Maze(String m){ 
    mp = new MazeParser(m); 
    myBoard = mp.parseMaze(); 
    myLocation = new Point(1,1); 
    boardSize = mp.sizeOfBoard(); 
    sol = new Stack<String>(); 
    } 

    public void appendSol(String s){ 
    sol.push(s); 
    } 

    public String printSol(){ 
    String solution = ""; 
    while(!sol.isEmpty()) { 
     solution += sol.pop(); 
    } 
    return solution; 
    } 

    public char board(int x, int y) { 
line 34  return myBoard[x][y]; 
    } 
    public char [][] getBoard() { 
     return myBoard; 
    } 

    public Point size(){ 
    return boardSize; 
    } 

    public Point getLoc(){ 
    return myLocation; 
    } 

    public void setLoc(Point p){ 
    myLocation = p; 
    } 

    public static void main(String[] args) { 

    Maze testMaze = new Maze(" ___________________ \n" 
      + "|_ | ___  _ _|\n" 
      + "| | | _|___| |_ | |\n" 
      + "| _____|_ | _| |\n" 
      + "| | | _ | _|_ | |\n" 
      + "|___| | | | _ | | |\n" 
      + "| |_ | _____| | |_|\n" 
      + "| |___| | _| |_ |\n" 
      + "|  | |___ |_ | |\n" 
      + "|_| | | _ |_| |_| |\n" 
      + "|___|___|_______|___|\n"); 

    MazeSolver.mazeSolver(testMaze,new Point(1,1),3); 
    System.out.println(testMaze.printSol()); 
     } 

} 

Вот как я выбрал, куда я могу пойти. PathChoices:

public class PathChoices { 

public static boolean isSouth(int x, int y, Maze myMaze){ 
if (myMaze.board(x+1, y) == '|'){ 
    return false; 
} else { 
     return (myMaze.board(x,y) != '_' && !(myMaze.board(x+1,y) == '|')) && 
      (myMaze.board(x+1,y) == '_' || 
      myMaze.board(x+1,y) == ' '); 
} 
} 

public static boolean isNorth(int x, int y, Maze myMaze){ 
if (myMaze.board(x-1, y) == '|'){ 
    return false; 
} else { 
     return myMaze.board(x-1,y) == ' '; 
} 
} 

public static boolean isEast(int x, int y, Maze myMaze){ 
if (myMaze.board(x, y+1) == '|'){ 
    return false; 
} else { 
     return myMaze.board(x,y+1) == '_' || 
      myMaze.board(x,y+1) == ' ' ; 
} 
} 

public static boolean isWest(int x, int y, Maze myMaze){ 
if (myMaze.board(x, y-1) == '|'){ 
    return false; 
} else { 
     return myMaze.board(x,y-1) == '_' || 
      myMaze.board(x,y-1) == ' ' ; 
} 
} 

}

Это мой Parser:

import java.awt.Point; 


public class MazeParser { 

    private int xLin; 
    private int yLin; 
    private char [][] mappedMaze; 
    private String [] myMazeArray; 

    public MazeParser(String m){ 
    String maze = m; 
     myMazeArray = maze.split("\n"); 
    xLin = myMazeArray[0].toCharArray().length; 
    yLin = myMazeArray.length; 
    mappedMaze = new char[yLin][xLin]; 
    } 
    public Point sizeOfBoard(){ 
    return new Point(yLin,xLin); 
     } 

    public char [][] parseMaze() { 

    for(int i = 0;i < yLin; i++) { 
     for (int j = 0; j < xLin; j++){ 
     mappedMaze[i][j] = myMazeArray[i].toCharArray()[j]; 
     } 
    } 
    return mappedMaze; 
    } 

} 

И последнее, но не менее ... Это метод Solver (тот, который я имею проблемы):

import java.awt.Point; 

public class MazeSolver { 

    /** 
    * Given the maze, the x and y coordinates (which must be odd), 
    * and the direction we came from, return true if the maze is 
    * solvable, and draw the solution if so. 
    */ 
    public static boolean mazeSolver (Maze m, Point p, int dirFrom) { 

    int x = p.x; 
    int y = p.y; 
    Maze maze = m; 

    boolean ok = false; 

    for (int i = 0 ; i < 4 && !ok ; i++) { 
     if (i != dirFrom) { 

     switch (i) { 
     // 0 = North, 1 = East, 2 = South, 3 = West 

     case 2: 
      if (PathChoices.isSouth(x,y,maze)) { 
      System.out.println(maze.board(x, y) + "\t::"+ maze.board(x+1, y) +"::W: " 
       + ""+maze.board(x, y-1) + "N: " 
        + ""+ maze.board(x-1, y) + "E: " 
         + ""+ maze.board(x, y+1) + ":*S: " 
          +maze.board(x+1, y) + ": " + x + " " + y + ": i " + i + " :" + dirFrom); 

      ok = mazeSolver (maze, new Point(x, y + 1), 0); 
      } 
      break; 
     case 1: 
      if (PathChoices.isEast(x,y,maze)){ 
      System.out.println(maze.board(x, y) + "\t::::W: " 
       + ""+maze.board(x, y-1) + "N: " 
        + ""+ maze.board(x-1, y) + "*E: " 
         + ""+ maze.board(x, y+1) + "S: " 
          +maze.board(x+1, y) + " " + x + " " + y + ": i " + i + " :" + dirFrom); 

      ok = mazeSolver (maze, new Point(x + 1, y), 3); 
      } 
      break; 
     case 3: 
      if (PathChoices.isWest(x,y,maze)){ 
      System.out.println(maze.board(x, y) + "\t::::*W: " 
       + ""+maze.board(x, y-1) + "N: " 
        + ""+ maze.board(x-1, y) + "E: " 
         + ""+ maze.board(x, y+1) + "S: " 
          +maze.board(x+1, y) + " " + x + " " + y + ": i " + i + " :" + dirFrom); 

      ok = mazeSolver (maze, new Point(x - 1, y), 1); 
      } 
      break; 
     case 0: 
      if (PathChoices.isNorth(x,y,maze)){ 
      System.out.println(maze.board(x, y) + "\t::::W: " 
       + ""+maze.board(x, y-1) + "*N: " 
        + ""+ maze.board(x-1, y) + "E: " 
         + ""+ maze.board(x, y+1) + "S: " 
          +maze.board(x+1, y) + " " + x + " " + y+ ": i " + i + " :" + dirFrom); 

      ok = mazeSolver (maze, new Point(x, y - 1), 2); 
      } 
      break; 
     default: 
      break; 
     } 
     } 
    } 
    // check for end condition 
    if (x == maze.size().x-1 && y == maze.size().y-2) 
     ok = true; 
    // once we have found a solution, draw it as we unwind the recursion 
    if (ok) { 
     switch (dirFrom) { 
     case 0: 
     maze.appendSol("N"); 
     break; 
     case 1: 
     maze.appendSol("E"); 
     break; 
     case 2: 
     maze.appendSol("S"); 
     break; 
     case 3: 
     maze.appendSol("W"); 
     break; 
     } 
    } 
    return ok; 
    } 
} 

Он бросает исключение, и проблема в том, что он не должен на PathChoice.java. Любая помощь приветствуется.

+1

Опубликовать трассировку стека. Слишком много кода для проверки. –

+0

отправил трассировку стека – Sabersimon

+0

Итак, в какой строке находится строка 34 Maze.java? –

ответ

1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
at Maze.board(Maze.java:34) 

К счастью, существует только одна строка, поэтому нам не нужно видеть номера строк.

public char board(int x, int y) { 
    return myBoard[x][y]; 
} 

Почти наверняка вы назвали этот метод с -1 в качестве одного из параметров. Не имеет смысла запрашивать -1-й или n-й элемент массива размера n. Можно использовать только индексы от 0 до n-1. Кроме того, я не буду говорить вам, что такое ArrayIndexOutOFBoundsException, - это слишком легко найти.

Кроме того, трассировка стека (номера других строк) сообщает вам, откуда она была вызвана.

at MazeSolver.mazeSolver(MazeSolver.java:38) 
... 
+0

да, я это знаю. Я позвонил с -1. Это было связано с обменом индексами. Спасибо за ваше время. – Sabersimon

1

Для случая 0, вы вызываете метод платы с й-1

maze.board(x-1, y) 

Так метод плата будет называться для

return myBoard[-1][y]; 

массива начинается с нулевым индексом. Следовательно, ArrayIndexOutOfBound

0

Похоже, что вы не обрабатываете края, когда вы вызываете maze.board() в свой класс MazeSolver.

Прежде чем пытаться идти в определенном направлении, убедитесь, что местоположение действительно существует. Например, перед вызовом maze.board (x, y-1) вы должны убедиться, что у вас уже нет минимального значения для y (-> 0).

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