2016-02-20 3 views
0

Вот метод лабиринта обхода и full codeКак исправить этот алгоритм рекурсивного лабиринта?

import java.io.*; 
import java.util.*; 

public class Quest { 

    static char[][] maze = new char[10][10]; 
    public static void main(String[] args) throws IOException { 
     Scanner scan = new Scanner(new File("quest.dat")); 
     String s = ""; 
     int n = scan.nextInt(); 
     scan.nextLine(); 

     while (n-->0) { 
      for (int i=0; i<10; i++) { 
      s = scan.nextLine(); 
      if (s.equals("-")) 
       break; 
      for (int j=0; j<10; j++) 
      maze[i][j] = s.charAt(j); 
     } 
     int r = searchR(); 
     int c = searchC(); 
     //System.out.println(r + " " + c); 
     mazeTraverse(r, c); 
     for (int i=0; i<10; i++) { 
     for (int j=0; j<10; j++) 
      System.out.print(maze[i][j]); 
     System.out.println(); 
    } 
    } 
} 
public static void mazeTraverse(int r, int c) { 
if ((r>0 && r<maze.length && c>0 && c<maze.length) && maze[r][c] == 'H') 
    return; 
if ((r>0 && r<maze.length && c>0 && c<maze.length) && (maze[r][c]=='.' || maze[r][c]=='A')) { 
    if (!(maze[r][c]=='A')) 
    maze[r][c] = 'O'; 

     mazeTraverse(r+1, c); 
     mazeTraverse(r-1, c); 
     mazeTraverse(r, c+1); 
     mazeTraverse(r, c-1); 

     maze[r][c] = '.'; 
    } 
} 

public static int searchR() { 
for (int r=0; r<10; r++) { 
    for (int c=0; c<10; c++) { 
    if (maze[r][c]=='A') 
     return r; 
    } 
} 
return -1; 
} 
public static int searchC() { 
    for (int r=0; r<10; r++) { 
    for (int c=0; c<10; c++) { 
     if (maze[r][c]=='A') 
     return c; 
    } 
    } 
    return -1; 
    } 
} 

Когда я запускаю программу, она просто работает непрерывно и не останавливается, но я проверил, и я получаю правильные значения г и с таким, что может быть проблема? Лабиринты 10х10, поэтому они идеальные квадраты.

+0

Вы уверены, что лабиринт квадратный? Если это не так, см. Мой ответ. Если это _is_, хорошо, мой ответ неверен, но веб-сайт для совместного использования кода занимает некоторое время, поэтому я не могу сразу проверить. – Arc676

+0

Да, это квадрат, оба они 10x10. –

+0

В этом случае индексы идут от 0 до 9. 'java.lang.ArrayIndexOutOfBoundsException: 10' Эта ошибка указывает, что вы пытались получить доступ к 10-му элементу, которого не существует. – Arc676

ответ

0

Мета-разговор: это плохо, если я оставляю этот ответ здесь, зная, что это неправильно, если я пытаюсь получить знак равного равного?


Вы проверяете rиc быть меньше, чем "длины" maze массива, но maze является 2D. Это означает, что есть две длины для проверки. (Представьте себе массив как прямоугольник. Существует длина, но и высота, и они не могут быть одинаковыми.)

c<maze.length 

Эта проверка не поможет, потому что c используется во втором индексе.

Попытка

c < maze[0].length //however, this assumes that there is at least one element in the array 

Пример:

говорят, что размер maze является 5x3. maze.length даст 5, а maze[0].length даст 3. Ваш чек будет видеть, если c меньше 5. 4 меньше 5, но не менее 3, поэтому вы получите исключение из-за пределов.

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