Лабиринт код не решает лабиринт, только печать - PullRequest
0 голосов
/ 02 марта 2020

У меня проблемы с кодом, который я пишу, чтобы решить, как создавать лабиринты с использованием шаблонов классов и стеков. Алгоритм работал достаточно хорошо, прежде чем я реализовал код, чтобы иметь возможность читать лабиринты из файлов. Теперь он не решает лабиринт, он только выводит «Стек заполнен! Не может pu sh» и печатает лабиринт. Алгоритм, которого я придерживаюсь, выглядит следующим образом:

  1. Определите двумерный массив int M, как указано выше, и два стека int, в которых будут храниться индекс строки и столбца проверенных нами местоположений.
  2. Поиск в массиве M, чтобы найти запись 2, чтобы найти вашу начальную точку
  3. Pu sh текущее местоположение (т. Е. Индекс строки и столбца) для стеков ().
  4. Проверьте, является ли значение, сохраненное в текущем местоположении, 3; если это так, мы сделали. Если нет, установите его на 2.
  5. Проверьте четыре соседа текущего местоположения по порядку (например, по часовой стрелке с севера). Если любое из них равно 1 или 3, поместите это место в стек и переместитесь туда далее.
  6. Если ни один из соседей не хранит 1, мы зашли в тупик: установите значение в этом месте равным 0 и извлеките новое местоположение из стека.

Любая помощь приветствуется!

#include <iostream>
#include <fstream>
#include <string>

#define MAX_STACK 10
void PrintMaze(int **Maze, int M, int N);
template <class T>

class MyStack {
private:
  T *contents;
  int top, maxsize;
public:
    ~MyStack(void);
    MyStack (void);
    MyStack (unsigned int StackSize);
    bool checkEmpty(void);
    bool checkFull(void);
    void push(T c);
    T pop(void );
    int scon(void);
};

template <class T> MyStack<T>::~MyStack(void)
{
    delete [] contents;
}
template <class T> MyStack<T>::MyStack(void)
{
  top=0;
  contents = new T [MAX_STACK];
  maxsize = MAX_STACK;
}

template <class T> MyStack<T>::MyStack(unsigned int StackSize)
{
  top=0;
  maxsize = StackSize;
  contents = new T[StackSize];
}

template <class T> bool MyStack<T>::checkEmpty(void)
{
    return MAX_STACK == 0;
}

template <class T> bool MyStack<T>::checkFull(void)
{
    return MAX_STACK == 10;
}

template <class T> void MyStack<T>::push(T c)
{
  if(checkFull())
  {
      std::cout << "Stack is fulL! Can not push" << std::endl;
  }
  else
  {
    contents[top]=c;
    top++;
  }
}

template <class T> T MyStack<T>::pop(void)
{
  top--;
  return(contents[top]);
  if(checkEmpty())
  {
    std::cout << "Stack empty! Can not pop" << std::endl;
    return 0;
  }
  else
  {
    top--;
    return(contents[top]);
  }
}

template <class T> int MyStack<T>::scon(void)
{
    return(*contents);
}

int main(void )
{

    // Open the file
    std::ifstream InFile;
    InFile.open("C:/Users/Desktop/Computer Science/Maze6.txt");
    if (InFile.fail())
    {
        std::cerr << "Error - cannot open Maze.txt" << std::endl;
        return(1);
    }

    // Read the size of the maze
    int Rows, Cols;
    InFile >> Rows >> Cols;
    std::cout << "The maze has " << Rows << " rows and " << Cols << " columns." << std::endl;

    // Dynamically assign memory for the array
    int **M = new int*[Rows];
    for(int i = 0; i < Rows; ++i)
    {
        M[i] = new int[Cols];
    }

    /// Read in the data
    for (int i=0; i<Rows; i++)
    for (int j=0; j<Cols; j++)
    {
        char c;
        InFile >> c;
        M[i][j] = (int)(c-'0');
    }

    // Display the maze
    std::cout << "Here is the maze: ";
    PrintMaze(M, Rows, Cols);

    //////////////////////////////
    MyStack<int> s1;
    MyStack<int> s2;
    for(int Rows=0; Rows<sizeof(M); Rows++)
    {
        for(int Cols=0; Cols<sizeof(M); Cols++)
        {
            if(M[Rows][Cols] == 2)
            {
                s1.push(Rows);
                s2.push(Cols);
                if(Rows-1 == 1)
                {
                    s1.push(Rows-1);
                    s2.push(Cols-1);
                    M[Rows-1][Cols] == 2;
                }
                if(Cols+1 == 1)
                {
                    s1.push(Rows);
                    s2.push(Cols+1);
                    M[Rows][Cols+1] == 2;
                }
                if(Rows+1 == 1)
                {
                    s1.push(Rows+1);
                    s2.push(Cols);
                    M[Rows-1][Cols] == 2;
                }
                if(Cols-1 == 1)
                {
                    s1.push(Rows);
                    s2.push(Cols-1);
                    M[Rows][Cols-1] == 2;
                }
                else
                {
                    M[Rows][Cols] = 0;
                    s1.pop();
                    s2.pop();
                }
            }
            if(M[Rows][Cols] == 3)
            {
                std::cout << "Maze completed! Item found at row: " << Rows << " column: " << Cols << std::endl;
                std::cout << "Column path: " << s2.scon() << std::endl;
                std::cout << "Row path: " << s1.scon() << std::endl;
            }
            else
            {
                M[Rows][Cols] == 2;
            }
        }
    }
    //////////////////////////////


    // Deallocate memory

    for(int i =0; i<6; i++)
    {
        for(int j = 0; j<6; j++)
        {
            std::cout <<M[i][j] << ' ';
        }
        std::cout << std::endl;
    }
    return (0);
}

void PrintMaze(int **Maze, int M, int N)
{
    std::cout << std::endl;
    for(int i = 0; i<M; i++)
    {
        for(int j=0; j<N; j++)
        {
            std::cout << Maze[i][j];
        }
        std::cout << std::endl;
    }
}

1 Ответ

1 голос
/ 02 марта 2020

sizeof(M) неверно, он даст вам размер самого указателя M, а не размер того, на что он указывает. Вам необходимо явно использовать переменные Rows и Cols, используя их исходные значения, и использовать разные значения для перебора строк и столбцов.

Как и в

//////////////////////////////
MyStack<int> s1;
MyStack<int> s2;
for(int i=0; i<Rows; i++)
{
    for(int j=0; j<Cols; j++)
    {
        // Use i and j as indexes...
    }
}
...