解迷宫题,循环出现问题

想解迷宫路径,但我的代码只循环了11次(进了一个死胡同后回溯不出去的感觉)
请帮忙看看是哪里的问题


#include<iostream>
using namespace std;
#include<stack>
using std::stack;

//arr[][]为迷宫二维数组,cur为当前位置,初始化为入口,end为出口位置
struct Point1//定义表示迷宫位置的结构体类型
{
    int x;
    int y;
    char o;
};
struct Point2
{
    int x;
    int y;
};
const int r = 10;

class MazeSolution
{
public:
    MazeSolution() { stack<Point2>Stack; }
    ~MazeSolution() {};
    void Maze(int arr[r][r], Point1* cur, Point2 end);
    void Maze2(int arr[r][r], Point1* cur, Point2 end, int m);
private:
    stack<Point2>Stack;
};

void MazeSolution::Maze(int arr[r][r], Point1* cur, Point2 end)
{
    int m = 0;
    Stack.push({ cur[m].x,cur[m].y });//入栈
    do {
        arr[cur[m].x][cur[m].y] = 2;//设置当前为有效
        //Stack.push({ cur[m].x,cur[m].y });//入栈
        if (arr[cur[m].x][cur[m].y + 1] == 0)//向东搜索
        {
            cur[m + 1].x = cur[m].x;
            cur[m + 1].y = cur[m].y+1;
            cur[m].o = 'e';
        }
        else if (arr[cur[m].x + 1][cur[m].y] == 0)//向南搜索
        {
            cur[m + 1].x = cur[m].x+1;
            cur[m + 1].y = cur[m].y;
            cur[m].o = 's';
        }
        else if (arr[cur[m].x][cur[m].y - 1] == 0)//向西搜索
        {
            cur[m + 1].x = cur[m].x;
            cur[m + 1].y = cur[m].y-1;
            cur[m].o = 'w';
        }
        else if (arr[cur[m].x - 1][cur[m].y] == 0)//向北搜索
        {
            cur[m + 1].x = cur[m].x-1;
            cur[m + 1].y = cur[m].y;
            cur[m].o = 'n';
        }
        else 
        {
            Maze2(arr, cur, end, m);
        }
        Stack.push({ cur[m].x,cur[m].y });//入栈
        cout << "-----cur[m].x=" << cur[m].x << "----cur[m].y=" << cur[m].y << endl;
        cout << Stack.top().x << "  " << Stack.top().y << endl;
        cout << "m=" << m << endl;
        m += 1;
    } while ((cur[m].x != end.x) && (cur[m].y != end.y));
}

void MazeSolution::Maze2(int arr[r][r], Point1* cur, Point2 end, int m)
{
    do {
        Stack.pop();//当前位置出栈
        m--;
        if ((cur[m].o != 'e') && (arr[cur[m].x][cur[m].y + 1] == 0))
        {
            cur[m + 1].x = cur[m].x;
            cur[m + 1].y = cur[m].y+1;
            cur[m].o = 'e';
        }
        else if ((cur[m].o != 's') && (arr[cur[m].x + 1][cur[m].y] == 0))
        {
            cur[m + 1].x = cur[m].x+1;
            cur[m + 1].y = cur[m].y;
            cur[m].o = 's';
        }
        else if ((cur[m].o != 'w') && (arr[cur[m].x - 1][cur[m].y] == 0))
        {
            cur[m + 1].x = cur[m].x;
            cur[m + 1].y = cur[m].y-1;
            cur[m].o = 'w';
        }
        else if((cur[m].o != 'w')&&(arr[cur[m].x - 1][cur[m].y] == 0))
        {
            cur[m + 1].x = cur[m].x-1;
            cur[m + 1].y = cur[m].y;
            cur[m].o = 'n';
        }
        else
        {
            Stack.pop();//当前位置出栈
            m--;
        }
    } while (((cur[m].x != end.x) && (cur[m].y != end.y)) || ((cur[m].x == Stack.top().x) && (cur[m].y == Stack.top().y)));
}

//迷宫
int main()
{
    int maze_graph[r][r] =
    {
        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
        0,0,0,-1,0,0,0,-1,0,-1,
        -1,0,0,-1,0,0,0,-1,0,-1,
        -1,0,0,0,0,-1,-1,0,0,-1,
        -1,0,-1,-1,-1,0,0,0,0,-1,
        -1,0,0,0,-1,0,0,0,0,-1,
        -1,0,-1,0,0,0,-1,0,0,-1,
        -1,0,-1,-1,-1,0,-1,-1,0,-1,
        -1,-1,0,0,0,0,0,0,0,0,
        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
    };

    const int n = 100;
    Point1 cur[n];
    cur[0] = { 1, 0, 'e' };
    Point2 end = { 8,9 };
    MazeSolution t;
    t.Maze(maze_graph, cur, end);
}
  1. 在MazeSolution构造函数中,创建了stackStack对象,但是在函数执行完之后,Stack对象会被自动销毁,成为一个空栈,此时在类的其他成员函数中使用Stack就会出现错误。

  2. Maze函数中的do-while循环中,判断迷宫是否到达终点的条件是错误的,应该是cur[m].x != end.x || cur[m].y != end.y,而不是cur[m].x != end.x && cur[m].y != end.y。

  3. Maze2函数中的条件判断有误,第四个条件应该是cur[m].o != 'n',而不是cur[m].o != 'w'。

  4. Maze2函数中的循环结束条件也有误,应该是((cur[m].x != end.x) || (cur[m].y != end.y)) && ((cur[m].x != Stack.top().x) || (cur[m].y != Stack.top().y))。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7677018
  • 你也可以参考下这篇文章:两个整数的二进制数有多少的位不同
  • 除此之外, 这篇博客: 关于求一个整数的位数,各位数逆序输出,各位数顺序输出的问题中的 求一个整数各位数的逆序输出 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    其实该问题的处理复杂度,要略比前两个问题高一些。我们要从最高位到个位需要依次输出,首先我们的思路是,通过利用10(count-1)(如问题1,在这里表示整数n的位数,在此我们令该数叫power)对整数n进行整除,这样的话,就需要得到count,即位数,所以我们在实现过程中需要用到求位数的函数以获取该位数。我们利用power可以获得最高位位数,并且将它打印出来。之后我们利用power对整数n求余,可以将最高位舍去,power整除10,接着重复该操作直至整数n为0。当然,负数和0的处理与上个问题的处理方式类似。以下是C语言的实现代码:

    int PrintOrder(int n){
    	int power = (int)pow(10.0,count(n));
    	if(n < 0){
    		printf("-");
    		n = -n;
    	}
    	do{
    		printf("%d ",n/power);
    		n %= power;
    		power /= 10;
    	}while(n != 0);
    	return 0;
    }
    

    以上就是我对这三个问题的一些看法。

  • 您还可以看一下 吴刚老师的【吴刚】简历包装与面试技巧视频教程课程中的 11-移动端应用项目配色规范与配色统一性小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^