Можете помочь переделать код так, чтобы был использован собранный вручную стек через структура на динамической памяти. И мб можно как-то упростить этот код? Пожалуйста помогите, умоляю.
(Лабиринт задан в виде прямоугольно матрицы, в которой используются такие
обозначения: 0 - возможен проход, 1 - стена. Даны координаты позиции
путника в лабиринте. Распечатать путь, по которому путник может
выйти из лабиринта, если выход существует. Считается, что путник вышел из
лабиринта, если он находится на первом или последнем строке матрицы, или
на первом или последнем столбце. Путник может двигаться только по
горизонтали или по вертикали.)
И еще не выходит так, чтоб путь заканчивался в любой из стенок, путник идет всегда в нижний правый угол и чтоб матрица сама была прописана в мейне, а не генерировалась.
Код:
// Лабиринт задан в виде прямоугольной матрицы, в которой используются такие
// обозначения: 0 - возможен проход, 1 - стена. Даны координаты позиции
// путника в лабиринте. Распечатать путь, по которому путник может
// выйти из лабиринта, если выход существует.
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<cstdio>
using namespace std;
// Генерируем лабиринт
const int A = 5; // высота
const int B = 5; // ширина
int maze[A][B]; // лабиринт
// Функция создает матрицу, заполняет ее 0 и 1 случайным образом и выводит на консоль
// Выходные данные: лабиринт в виде матрицы
void initialMaze()
{
maze[0][0] = 0;//Вход
maze[A - 1][B - 1] = 0;//Выход
for(int i = 0; i < A; i++) { //Заполняем рандомными числами 0,1
for (int j = 0; j < B; j++) {
if (i == 0 && j == 0)
continue;
if (i == A - 1 && j == B - 1)
continue;
maze[i][j] = rand() % 2;
}
}
//Показать сгенерированный лабиринт
for (int i = 0; i < A; i++) {
for (int j = 0; j < B; j++) {
cout << maze[i][j];
if (j != B - 1) {
cout << " ";
}
else {
cout << endl;
}
}
}
}
//Генерируем направление
int directory[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };
// Определяем находиться ли он за пределами лабиринта
bool isLeap(int x, int y)
{
return x >= 0 && x < B && y >= 0 && y < A;
}
//Позиция
struct point {
int x;
int y;
};
// Объявляем структуру, используемую для хранения пути
struct direction
{
int x;
int y;
int d;
};
// Объявляем стек, используемый для хранения пути
stack<direction> directoryStack;
// Отслеживание лабиринта
void mazeTravel(point start, point end, int maze[A][B], int directory[4][2])
{
stack<direction> s;
direction element;
int i;
int j;
int d;
int a;
int b;
maze[start.x][start.y] = 2;// Сначала отмечаем отправную точку
element.x = start.x;// первая позиция
element.y = start.y;
element.d = -1;
directoryStack.push(element); // добавляем элемент
while(!directoryStack.empty())// Проверяем не пуст ли стек ( когда стек не пуст, значит есть путь )
{
element = directoryStack.top(); // верхний элемент стека
directoryStack.pop(); // удаляем верхний элемент стека
i = element.x;
j = element.y;
d = element.d + 1;
while (d < 4)
{
a = i + directory[d][0];// прогнозируемое положение следующей точки
b = j + directory[d][1];
if(a == end.x && b == end.y && maze[a][b] == 0)// когда нашли выход
{
element.x = i; // помещаем исходные элементы в стек
element.y = j;
element.d = d; // изменяем направление исходного элемента
directoryStack.push(element); // добавляем элемент
element.x = a;
element.y = b;
element.d = 886;
directoryStack.push(element);// информация о выходе
while(!directoryStack.empty())// последовательность выходного лабиринта обратной последовательности
{
direction temp = directoryStack.top();
directoryStack.pop();
s.push(temp);
}
while (!s.empty())
{
direction temp = s.top();
s.pop();
printf("-->(%d,%d)", temp.x, temp.y);
}
return;
}
if (isLeap(a, b))
{
if (maze[a][b] == 0)
{
maze[a][b] = 2;
element.x = i;
element.y = j;
element.d = d;
directoryStack.push(element);
i = a;
j = b;
d = -1;
}
}
d++;
}
}
printf_s("There is no way to get out of this maze\n");
}
// Основная функция
int main()
{
srand(time(0));
initialMaze();
point a, b;
a.x = 0;
a.y = 0;
b.x = A - 1;
b.y = B - 1;
mazeTravel(a, b, maze, directory);
return 0;
}