Что вызывает ошибку времени выполнения массива вне границ?

Это метод класса, который используется для поиска выхода трехмерного лабиринта, представленного в виде трехмерного массива. Сам массив содержит строки длиной 6 или 1 или 0. «1» в строке означает, что вы можете двигаться в этом направлении. Например, если строка в текущем элементе массива равна 100001, это означает, что вы можете двигаться на север и также двигаться вниз по уровню. Строка битов соответствует направлениям северо-восток-юг-запад вниз. Этот метод в настоящее время не завершен, поэтому я знаю, что он еще не нашел жизнеспособного решения, но оператор switch в конце вызывает ошибку выхода за пределы массива во время выполнения. Я представляю трехмерный массив в виде трехмерного куба с самым внешним массивом, представляющим вертикальную ось, средним массивом, представляющим ось z, входящим и выходящим из страницы, и самым внутренним массивом, представляющим горизонтальную ось x. Когда на текущей ячейке в лабиринте, вы смотрите на каждый бит в строке. Для каждого возможного хода вы добавляете этот ход к q. Как только вы закончите смотреть на строку, вы двигаетесь в направлении, которое было впервые добавлено в очередь, и повторяете. Любая помощь с благодарностью.

void maze::solve(int startlevel, int startrow, int startcol, int endlevel,   int endrow, int endcol)
{
position current, exit;
current.level = startlevel;
current.row = startrow;
current.col = startcol;

exit.level = endlevel;
exit.row = endrow;
exit.col = endcol;

q.push('0');
while (!q.empty())
{
if (current == exit)
{
cout << "exit found" << endl;
return;
}

if (mazeGraph[current.level][current.row][current.col].at(0) == '1')
q.push('n');
if (mazeGraph[current.level][current.row][current.col].at(1) == '1')
q.push('e');
if (mazeGraph[current.level][current.row][current.col].at(2) == '1')
q.push('s');
if (mazeGraph[current.level][current.row][current.col].at(3) == '1')
q.push('w');
if (mazeGraph[current.level][current.row][current.col].at(4) == '1')
q.push('u');
if (mazeGraph[current.level][current.row][current.col].at(5) == '1')
q.push('d');

if (q.front() == '0')
q.pop();

switch (q.front())
{
case 'n':
current.row -= 1;
case 'e':
current.col += 1;
case 's':
current.row += 1;
case 'w':
current.col -= 1;
case 'u':
current.level += 1;
case 'd':
current.level -= 1;

}

}
return;
}

0

Решение

Отладить, прежде чем получить доступ mazeGraph[current.level][current.row][current.col] Вы должны проверить, если current.level находится между minLevel а также maxLevel аналогично с current.row а также current.col все в границах лабиринта. Если они не распечатывают сообщение с current.level и вы будете знать, почему он выбрасывает эту ошибку.

Я также предполагаю, что ваш mazeGraph инициализирован так, чтобы эти границы удовлетворялись начальным и конечным уровням и т. Д.

PS: для лучшего поиска пути между двумя узлами в матрице алгоритм A * (звезда) во многих случаях является лучшим решением.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]