проблема
В вашем коде 2 ошибки:
1 - условие в вашем цикле говорит:
while(work == true && (0 < row && row < NUMBER_OF_ROWS) && (0 < column && column < NUMBER_OF_COLUMNS));
0 < row
неверно, это означает, что вы не можете запустить первую строку с индексом 0. Но вы хотите иметь возможность это сделать, поэтому на самом деле вам нужно написать 0 <= row
. Так что исправьте это так:
while(work && (0 <= row && row < NUMBER_OF_ROWS) && (0 <= column && column < NUMBER_OF_COLUMNS));
2 - условие для проверки, если вы нашли выход
if(row == NUMBER_OF_ROWS && column == exitIndex)
здесь вы проверяете, что вы вышли из нижнего ряда, вы хотите проверить, вышли ли вы из верхнего ряда, то есть строка равна -1. Поэтому перепишите это так:
if(row < 0 && column == exitIndex)
примечание
Я думаю, вы бы значительно улучшили читабельность, и было бы намного проще протестировать, если бы вы разбили свой код на методы. Вот пример:
private static final char[][] pathMatrix = {
{ 'O', 'V', 'O', '^', '<', '<' },
{ 'O', 'V', 'V', '*', '^', '^' },
{ '*', 'V', '*', 'O', '*', '^' },
{ 'O', 'V', 'O', 'O', 'V', '^' },
{ 'O', '>', '>', '>', '>', '^' }, };
private static final int NUMBER_OF_COLUMNS = 6;
private static final int NUMBER_OF_ROWS = 5;
public static void main(String[] args) {
printMatrix();
int[] currentPosition = findEntrance();
System.out.println("Entrance: " + currentPosition[0] + " " +currentPosition[1] + " " + pathMatrix[currentPosition[0]][currentPosition[1]]);
while(isInsideMatrix(currentPosition) && isArrow(currentPosition)) {
System.out.println(currentPosition[0] + " " + currentPosition[1] + " " + pathMatrix[currentPosition[0]][currentPosition[1]]);
currentPosition = move(currentPosition);
}
if(isInsideMatrix(currentPosition)) {
System.out.println("No path has been found in the maze above");
} else {
System.out.println("The path has been found in the maze above");
}
}
Находит вход в лабиринт. Возвращает позицию как int [] в форме {rowIndex, colIndex}
private static int[] findEntrance() {
char c;
// scan first and last rows
for(int column = 0; column < NUMBER_OF_COLUMNS; column++) {
// first row
c = pathMatrix[0][column];
if(c == 'V') {
return new int[] {0, column};
}
// last row
c = pathMatrix[NUMBER_OF_ROWS-1][column];
if(c == '^') {
return new int[] {NUMBER_OF_ROWS-1, column};
}
}
// scan first and last columns
for(int row = 0; row < NUMBER_OF_ROWS; row++) {
// first column
c = pathMatrix[row][0];
if(c == '>') {
return new int[] {row, 0};
}
// last row
c = pathMatrix[row][NUMBER_OF_COLUMNS-1];
if(c == '<') {
return new int[] {row, NUMBER_OF_COLUMNS-1};
}
}
return null;
}
Перемещает курсор и возвращает следующую позицию. Предполагая, что мы сейчас стоим на стрелке
private static int[] move(int[] position) {
int row = position[0];
int col = position[1];
char charAtPosition = pathMatrix[position[0]][position[1]];
int[] newPosition;
if(charAtPosition == 'V') {
newPosition = new int[] {row+1, col};
} else if(charAtPosition == '^') {
newPosition = new int[] {row-1, col};
} else if(charAtPosition == '>') {
newPosition = new int[] {row, col+1};
} else if(charAtPosition == '<') {
newPosition = new int[] {row, col-1};
} else {
throw new RuntimeException("Should never come in here.");
}
return newPosition;
}
Проверяет, есть ли стрелка в заданной позиции
private static boolean isArrow(int[] position) {
int row = position[0];
int col = position[1];
char charAtPosition = pathMatrix[row][col];
return charAtPosition == 'V' || charAtPosition == '^'
|| charAtPosition == '<' || charAtPosition == '>';
}
Проверяет, находится ли заданная позиция внутри матрицы
private static boolean isInsideMatrix(int[] position) {
int row = position[0];
int col = position[1];
return row >= 0 && row < NUMBER_OF_ROWS
&& col >= 0 && col < NUMBER_OF_COLUMNS;
}
Печать матрицы
private static void printMatrix() {
for(int row = 0; row < NUMBER_OF_ROWS; row++){
for(int column = 0; column < NUMBER_OF_COLUMNS; column++){
System.out.print(pathMatrix[row][column] + " ");
}
System.out.print('\n');
}
}
Это выводит:
O V O ^ < <
O V V * ^ ^
* V * O * ^
O V O O V ^
O > > > > ^
Entrance: 0 1 V
0 1 V
1 1 V
2 1 V
3 1 V
4 1 >
4 2 >
4 3 >
4 4 >
4 5 ^
3 5 ^
2 5 ^
1 5 ^
0 5 <
0 4 <
0 3 ^
The path has been found in the maze above