const S = -1 // Стартовая точки
const E = -2 // Конечная точка
const W = -3 // Стены
const R = -4 // Маршрутная точка
var matrix = [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, E, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, S, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
];
// Присвоение индексов
var repeat = true;
while(repeat){
for(y = 0; y < matrix.length; y++){
for(x = 0; x < matrix.length; x++){
// Находим стартовую точку и присваиваем индекс 1 пустым ячейкам вокруг
if(matrix[y][x] == -1){
if(matrix[y+1][x] == 0){
matrix[y+1][x] = 1;
}
if(matrix[y-1][x] == 0){
matrix[y-1][x] = 1;
}
if(matrix[y][x+1] == 0){
matrix[y][x+1] = 1;
}
if(matrix[y][x-1] == 0){
matrix[y][x-1] = 1;
}
}
// У положительных индексов
else if(matrix[y][x] > 0){
if(matrix[y+1][x] == 0){
matrix[y+1][x] = matrix[y][x] + 1;
}
if(matrix[y-1][x] == 0){
matrix[y-1][x] = matrix[y][x] + 1;
}
if(matrix[y][x+1] == 0){
matrix[y][x+1] = matrix[y][x] + 1;
}
if(matrix[y][x-1] == 0){
matrix[y][x-1] = matrix[y][x] + 1;
}
// Проверяем дошли ли до конечной точки
if(matrix[y+1][x] == -2){
var endIndex = matrix[y][x]+1; // Индекс золота
var endPosY = y+1; // Положение золота по Y в матрице
var endPosX = x; // Положение золота по Х в матрице
repeat = false;
}
if(matrix[y-1][x] == -2){
var endIndex = matrix[y][x]+1;
var endPosY = y-1;
var endPosX = x;
repeat = false;
}
if(matrix[y][x+1] == -2){
var endIndex = matrix[y][x]+1;
var endPosY = y;
var endPosX = x+1;
repeat = false;
}
if(matrix[y][x-1] == -2){
var endIndex = matrix[y][x]+1;
var endPosY = y;
var endPosX = x-1;
repeat = false;
}
}
}
}}
// Построение кратчайшего маршрута
var repeat = true;
while(repeat){
// Если точка маршрута не определена, то создаем ёё рядом с золотом
if(typeof routeIndex == 'undefined' && typeof routePosX == 'undefined' && typeof routePosY == 'undefined'){
if(matrix[endPosY][endPosX-1] == endIndex-1){
var routeIndex = matrix[endPosY][endPosX-1]; // Присваиваем новый индекс текущей точки маршрута
var routePosX = endPosX-1; // Присваиваем новое положение текущей точки маршрута по Y в матрице
var routePosY = endPosY; // Присваиваем новое положение точки маршрута по Х в матрице
}
else if(matrix[endPosY][endPosX+1] == endIndex-1){
var routeIndex = matrix[endPosY][endPosX+1];
var routePosX = endPosX+1;
var routePosY = endPosY;
}
else if(matrix[endPosY-1][endPosX] == endIndex-1){
var routeIndex = matrix[endPosY-1][endPosX];
var routePosX = endPosX;
var routePosY = endPosY-1;
}
else if(matrix[endPosY+1][endPosX] == endIndex-1){
var routeIndex = matrix[endPosY+1][endPosX];
var routePosX = endPosX;
var routePosY = endPosY+1;
}
}
// Если точка маршрута уже была определена
else {
if(matrix[routePosY][routePosX-1] == routeIndex-1){
matrix[routePosY][routePosX] = -4; // Присваивание предыдущей точки маршрута значение -4
var routeIndex = matrix[routePosY][routePosX-1];
var routePosX = routePosX-1;
var routePosY = routePosY;
}
else if(matrix[routePosY][routePosX+1] == routeIndex-1){
matrix[routePosY][routePosX] = -4;
var routeIndex = matrix[routePosY][routePosX+1];
var routePosX = routePosX+1;
var routePosY = routePosY;
}
else if(matrix[routePosY-1][routePosX] == routeIndex-1){
matrix[routePosY][routePosX] = -4;
var routeIndex = matrix[routePosY-1][routePosX];
var routePosX = routePosX;
var routePosY = routePosY-1;
}
else if(matrix[routePosY+1][routePosX] == routeIndex-1){
matrix[routePosY][routePosX] = -4;
var routeIndex = matrix[routePosY+1][routePosX];
var routePosX = routePosX;
var routePosY = routePosY+1;
}
else {
matrix[routePosY][routePosX] = -4;
repeat = false;
}
}
}
Реализовывал волновой алгоритм на JavaScript, с матрицей 10х10 все было хорошо, а с 20х20 возникает ошибка, что matrix[(y + 1)] не определена. Как решить проблему? Как y может быть не определена?