想解迷宫路径,但我的代码只循环了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);
}
在MazeSolution构造函数中,创建了stackStack对象,但是在函数执行完之后,Stack对象会被自动销毁,成为一个空栈,此时在类的其他成员函数中使用Stack就会出现错误。
Maze函数中的do-while循环中,判断迷宫是否到达终点的条件是错误的,应该是cur[m].x != end.x || cur[m].y != end.y,而不是cur[m].x != end.x && cur[m].y != end.y。
Maze2函数中的条件判断有误,第四个条件应该是cur[m].o != 'n',而不是cur[m].o != 'w'。
Maze2函数中的循环结束条件也有误,应该是((cur[m].x != end.x) || (cur[m].y != end.y)) && ((cur[m].x != Stack.top().x) || (cur[m].y != Stack.top().y))。
其实该问题的处理复杂度,要略比前两个问题高一些。我们要从最高位到个位需要依次输出,首先我们的思路是,通过利用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;
}
以上就是我对这三个问题的一些看法。