2016-11-30 20 views
0

Это метод класса, который используется для нахождения выхода 3-мерного лабиринта, представленного в виде 3-мерного массива. Сам массив содержит строки длиной 6 или 1 или 0. А '1' в строке означает, что вы можете двигаться в этом направлении. Например, если строка в текущем элементе массива равна 100001, это означает, что вы можете перемещаться на север, и вы также можете перемещаться вниз по уровню. Битовая строка соответствует направлениям северо-восток на юго-запад вниз. Этот метод в настоящее время не завершен, поэтому я знаю, что он еще не нашел жизнеспособного решения, но оператор switch в конце вызывает ошибку за пределами границ во время выполнения. Я представляю 3-мерный массив как 3-й куб с самым внешним массивом, представляющим вертикальную ось, средний массив, представляющий ось 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; 
} 

ответ

1

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

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

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

+0

Я пытаюсь сделать это с помощью «, если (current.level <0 || current.level> = this.numlevels) \t \t { \t \t \t COUT << "вне границ" << епсИ \t \t} « , но компилятор говорит, что для« этого »требуется тип класса – Flower