Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2021, 18:16   #1
AnastasiaGalaxu
Новичок
Джуниор
 
Регистрация: 24.03.2021
Сообщений: 1
По умолчанию Распечатать путь из лабиринта С++

Можете помочь переделать код так, чтобы был использован собранный вручную стек через структура на динамической памяти. И мб можно как-то упростить этот код? Пожалуйста помогите, умоляю.
(Лабиринт задан в виде прямоугольно матрицы, в которой используются такие
обозначения: 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;
}
AnastasiaGalaxu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход из лабиринта /C++ dzels Помощь студентам 2 06.06.2013 15:14
Генерация лабиринта в Delphi dancer1 Помощь студентам 4 21.02.2012 07:09
Алгоритм прохождения лабиринта PAVEL315 Общие вопросы Delphi 13 02.01.2010 01:22
Выход из лабиринта karamelka87 Общие вопросы C/C++ 9 27.01.2009 23:49
Генерирование рандомного лабиринта Djaconda Паскаль, Turbo Pascal, PascalABC.NET 12 12.11.2007 19:00