Я написал программу для создания лабиринта и его решения, однако в решающей части есть ошибка.
Это формирует квадратный лабиринт как 5 * 5 или 16 * 16.
Лабиринт начинается с (0,0 в двумерном массиве и заканчивается (size () — 1, size () — 1).
Я использую «1», чтобы указать путь до конца.
Вы можете видеть на рисунке ниже некоторые нежелательные «1», хотя программа может найти выход.
Извините, я действительно не могу отладить это. Кто-нибудь может мне помочь или направить меня?
Очень признателен!
Снимок экрана здесь. Я не могу публиковать изображения напрямую
https://photos-1.dropbox.com/t/0/AADjdwSgmLdVKCZrI1C-gDvwZ9ORj0rGbv3UJ7AYqXWeuA/10/7014161/png/2048×1536/2/1355295600/0/2/bug.png/5sQR3E_jcow4lWIy9cFf2FYbmwl0C_sd2cfCyMPe0MU
Мой код здесь
https://www.dropbox.com/s/vldkcv4fy6bp1ff/Source.cpp
ПРОБЛЕМА РЕШЕНА
Спасибо всем
мой оригинальный код для решения лабиринта был
`else if (randomNum == 1) {
if (y+1<myMaze.size() && !myMaze[x][y+1].left && !myMaze[x][y+1].visited)
{
y++;
myMaze[x][y].truePath=true;
myMaze[x][y].visited=true;
s1.push(myMaze[x][y]);
randomNum=rand()%4;
}
else
{
rightBusted=true;
randomNum=rand()%4;
}`
Затем я просто добавляю эти коды в оператор if, чтобы сбросить переменные bool в false, тогда проблема решена
downBusted=false;
rightBusted=false;
topBusted=false;
leftBusted=false;
Вы можете отладить это, чувак. Вот как. У вас уже есть инструменты, необходимые для этого; все, что им нужно, это немного подправить.
Ваш лучший инструмент для отладки это ваша подпрограмма displayMaze (). Вам просто нужно добавить два дополнительных параметра, чтобы превратить его в мощный инструмент отладки:
void displayMaze(const vector < vector<Cell> >& arr, int curX=-1, int curY=-1)
{
.
.
.
Теперь, если вызывающий абонент опускает curX & curY, компилятор заполняет значения по умолчанию -1. Далее в этой функции напечатайте другой символ, чтобы указать «текущую позицию лабиринта». Вот как я это сделал, что, похоже, работает, но я не гарантирую этого, потому что не удосужился понять вашу логику:
if (curX>=0 && curY>=0 && curX==i/2 && curY==j) // ++++++++++++
cout << " * "; // * means "current position" // ++++++++++++
else if (!arr[i/2][j].truePath)
cout << " ";
else
cout << " 1 ";
Теперь у вас есть внушительный инструмент отладки, встроенный в вашу программу. Когда main () вызывает его без двух дополнительных параметров, звездочка не печатается. Но когда вы вызываете его из solveMaze (), вы можете указать «текущее местоположение», чтобы оно помечало это местоположение с помощью «*». В solveMaze (), добавьте пару переменных для отслеживания «текущего местоположения» …
int x=0, y=0;
int curX=x, curY=y; // ++++++++++++++++
…затем, в верхней части цикла, просто вызовите ваш огромный инструмент отладки, чтобы получить пошаговый текущий статус вашего общего решения в процессе его выполнения:
int i=0;
while (!exitFound)
{
displayMaze(myMaze, curX, curY); // +++++++++++++++++
.
.
.
Теперь, где бы вы ни изменили то, что вы считаете «текущим местоположением», просто обновите curX и curY соответствующим образом, и ваш инструмент отладки будет держать вас в курсе, чтобы вы могли видеть решение в развернутом виде (ну, псевдографически). Вы могли бы даже добавить сообщения отладочной команды в ключевые моменты принятия логических решений, чтобы вы могли соотнести эти точки принятия решений с решением, которое вы видите в процессе развертывания, чтобы вы могли видеть, есть ли проблема в случае возникновения проблемы. И если вы обнаружите проблему, вы можете прокрутить обратно в вывод, чтобы увидеть, где что-то пошло не так.
Удачи!
Других решений пока нет …