为什么我不能输出迷宫的路径?谁能告诉我?请



关于数据结构,为什么我不能输出迷宫的路径? 我使用堆栈来存储当前位置的信息。通过文本文件读取迷宫地图,如果位置无法通过
将用"#"标记,它是一个墙,用"+"标记的方式标记。写于C++。PS:我的英语很差。

//stack.h
#ifndef _STACK_H_
#define _STACK_H_
#include<iostream>
#include<stdlib.h>
const int SIZE = 81;
using namespace std;
typedef struct
{
    int x;
    int y;
}PosType;
typedef struct SElemType{
    int ord;//steps
    PosType seat;//coordinate
    int di;//direction
}SElemType;
typedef struct SqStack{
    SElemType *base;
    SElemType *top;
    int StackSize;
}SqStack;
void Init_S(SqStack &S)
{
    S.base = new SElemType[SIZE];
    if(!S.base)
        exit(EXIT_FAILURE);
    S.top = S.base;
    S.StackSize = SIZE;
}
bool StackEmpty(SqStack S)
{
    if(S.top = S.base)
        return true;
    return false;
}
void Push(SqStack &S,SElemType e)
{
    SElemType *newbase;
    if(S.top-S.base>=S.StackSize)
    {
        newbase = new SElemType[S.StackSize*2];
        if(!S.base)
            exit(EXIT_FAILURE);
        for(int i(0);i<S.top-S.base;i++)
            *(newbase+i) = *(S.base+i);
        delete[]S.base;
        S.base = newbase;
        S.top = S.base+S.StackSize;
        S.StackSize *= 2;
    }
    *(S.top)++ = e;
}
void Pop(SqStack &S,SElemType e)
{
    if(StackEmpty(S))
        cout<<"empty stack!n";
    else
        e = *(--S.top);
}
#endif
//maze.cpp
#include<iostream>
#include<cstdlib>
#include<fstream>
#include"stack.h"
using namespace std;
const int m = 10;
const int n = 10;
typedef char MazeG[m][n];
void Show_MG(MazeG MG)
{
    for(int i(0);i<m;i++)
    {
        for(int j(0);j<n;j++)
        {
            cout<<MG[i][j];
        }
        cout<<"tn";
    }
}
PosType Next(PosType &pos,int di)
{
    PosType repos;
    switch(di)
    {
    case 0://north
        repos.x = pos.x-1;
        repos.y = pos.y;
        break;
    case 1://east
        repos.x = pos.x;
        repos.y = pos.y+1;
        break;
    case 2://south
        repos.x = pos.x+1;
        repos.y = pos.y;
        break;
    case 3://west
        repos.x = pos.x;
        repos.y = pos.y-1;
        break;
    default:
        break;
    }
    return repos;
}
int MazePath(MazeG &MG,PosType begin,PosType end)
{   
    PosType curpos = begin;
    SqStack S; 
    Init_S(S);
    SElemType e;
    e.ord = 0;
    do{
        if(MG[curpos.x][curpos.y]=='*')
        {
            MG[curpos.x][curpos.y] = '+';
            e.seat = curpos;
            e.di = 0;
            e.ord++;
            Push(S,e);
            if(curpos.x==end.x&&curpos.y==end.y)
            {
                cout<<"此迷宫的一条路径如下:(+标记为路径)n";//the path of maze:
                cout<<"走了"<<e.di<<"步到达出口n";//The number of steps walked
                Show_MG(MG);
                return 0;
            }
            else
                curpos = Next(curpos,e.di);
        }
        else
            if(!StackEmpty(S))
            {
                Pop(S,e);
                e.ord--;
                while(e.di==3&&!StackEmpty(S))
                {
                    MG[curpos.x][curpos.y] = '#';
                    Pop(S,e);
                    e.ord--;
                }
                if(e.di<3)
                {
                    e.di++;
                    Push(S,e);
                    e.ord++;
                    curpos = Next(curpos,e.di);
                }
            }
    }while(!StackEmpty(S));
    cout<<"此迷宫没有入口到出口的路径!n";//no path of the maze
    //return -1;
}
int main()
{
    MazeG MG;
    PosType begin,end;
    begin.x = 1; begin.y = 1;
    end.x = 8; end.y = 8;
    ifstream fin;
    fin.open("file.txt");
    if(!fin.is_open())
    {
        cout<<"erorr file!!n";
        exit(EXIT_FAILURE);
    }
    if(fin.good())
    {
        for(int i(0);i<m;i++)
            for(int j(0);j<n;j++)
                fin>>MG[i][j];
    }
    cout<<"迷宫图为:(*代表能通过)n";//map of maze:('*' is means through)
    Show_MG(MG);
    cout<<begin.x<<begin.y<<end.x<<end.y<<endl;
    fin.close();
    MazePath(MG,begin,end);
    return 0;
}
这是

错误的

bool StackEmpty(SqStack S)
{
    if(S.top = S.base)
        return true;
    return false;
}

应该是这个

bool StackEmpty(SqStack S)
{
    if(S.top == S.base) // == not =
        return true;
    return false;
}

使用==表示相等而不是=

现在,我明白了我的代码错误是我不匹配的数据将被堆栈存储。我已经更改了我的代码,没错。

//stack.h
SElemType Gettop(SqStack S)
{
     if(!Empty_S(S))
       return *(S.top-1);
}
//maze_path.cpp
    do{
            if(MG[curpos.x][curpos.y]=='*')
            {
                MG[curpos.x][curpos.y] = '+';
                e.seat = curpos;
                e.di = 0;
                e.ord++;
                Push(S,e);
                if(curpos.x==end.x&&curpos.y==end.y)
                {
                    cout<<"此迷宫的一条路径如下:(+标记为路径)n";//the path of maze:
                    cout<<"走了"<<e.di<<"步到达出口n";//The number of steps walked
                    Show_MG(MG);
                    return 0;
                }
                else
                    curpos = Next(curpos,e.di);
            }
            else
                if(!StackEmpty(S))
                {

                    if(e.di<3)
                    {
                        e.ord++;
                        curpos = Next(curpos,e.di);
                    }
                    else
                    {
                        MG[curpos.x][curpos.y] = '#';
                        Pop(S,e);
                        e = Gettop(S);
                    }
                }
        }while(!StackEmpty(S));

最新更新