@Banan44
Full Stack

Переменная не определена в цикле что делать?

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 может быть не определена?
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
При условии y < matrix.length код matrix[y+1] выйдет за границы массива. Длина массива всегда на единицу больше, чем его последний индекс*. Поэтому на последней итерации y равна последнему индексу, а y + 1 выходит за границы.
Это не y не определена, а элемент matrix[y+1].
Предвосхищая ваш вопрос, сразу скажу, что не знаю как это у вас работало раньше.

* если в массиве нет дыр, разумеется.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы