|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 墨笠阳 于 2023-7-9 09:35 编辑
调试时,有些数据运行结果是对的,但会报这个错误,有些数据运行结果有误,求大佬不吝指教  
- #define MAX_STACK_FindPath_SIZE 1275
- #define MAX_ROW 50
- #define MAX_COL 50
- //位置
- typedef struct position {
- int x = 0;
- int y = 0;
- int pos = 1;//1,有障碍 0 无障碍
- int step = 0;//1 已访问 0 未访问,-1 回退时再次访问
- }position;
- typedef struct {
- position* base;
- position* top;
- int stacksize;
- }Stack;
- //初始化
- int InitStack_FindPath(Stack& S) {
- S.base = new position[MAX_STACK_FindPath_SIZE];
- if (!S.base)
- return 0;
- else {
- S.top = S.base;
- S.stacksize = MAX_STACK_FindPath_SIZE;
- return 1;
- }
- }
- int InitStack_maze(Stack& S) {
- int max = MAX_ROW * MAX_COL;
- S.base = new position[max];
- if (!S.base)
- return 0;
- else {
- S.top = S.base;
- S.stacksize = max;
- return 1;
- }
- }
- //入栈
- int Push(Stack& S, position p) {
- if (S.top - S.base == S.stacksize)//栈满
- return 0;
- else {
- *S.top = p;
- S.top++;
- return 1;
- }
- }
- //出栈
- int Pop(Stack& S, position& p) {
- if (S.top == S.base)
- return 0;
- else {
-
- p = *(S.top - 1);
- /*
- p.x = (S.top - 1)->x;
- p.y = (S.top - 1)->y;
- p.pos = (S.top - 1)->pos;/**/
- S.top--;
- return 1;
- }
- }
- #include <iostream>
- #include <malloc.h>
- #include"struct.h"
- using namespace std;
- void Creat_maze(int row, int col, Stack& maze);
- int FindPath(Stack& maze, Stack& pass, position* p,position start, position end, int row, int col);
- int main() {
- position* p;//指向当前起点的指针
- Stack path;//通路
- Stack maze;//迷宫
- int m, n;//行、列
-
- //初始化指针p
- do {
- p = new position;
- } while (!p);
- //初始化path栈、maze栈
- InitStack_FindPath(path);
- InitStack_maze(maze);
- cout << "迷宫规格m*n:\n" << "请输入m,n的值\n" << endl;
- cin >> m >> n;
- position start = { 0 ,0 ,0 };//入口
- position end = { m - 1 , n - 1, 0 };//出口
- cout << "\n1 表示不可通行,0 表示可通行\n" ;
- cout << "默认入口为第一个元素,出口为最后一个元素," << "请输入迷宫元素\n" << endl;
- //构建迷宫m*n
- Creat_maze(m, n, maze);
- p = maze.base;
- Push(path, *p);
- if (FindPath(maze,path, p,start, end, m, n)) {
- p = path.base;
- cout << "通道为:" << endl;
- while (p != path.top) {
- cout << "\t(" << p->x << "," << p->y << ")" << endl;
- p++;
- }
- delete p;
- return 1;
- }
- else {
- cout << "此迷宫无通路!" << endl;
- delete p;
- return 0;
- }
- }
- void Creat_maze(int row, int col, Stack& maze) {
- int i, j;
- position p;
- for (i = 0; i < row; i++) {
-
- p.x = i;
- for (j = 0; j < col; j++) {
- p.y = j;
- cin >> p.pos;
- Push(maze, p);
- }
- }
-
- }
- /*
- * 通道函数:
- * 从起点出发,将起点入栈,标记其为已访问,然后依次对当前位置上,左,下,右进行深度遍历,
- * .1.若 p 所指的 position 的 上(左下右)可通,即 pos=0,且未被访问,即pos=0,则入栈pass
- * p.step=1 ,将新位置设为新起点,继续遍历,直到无前路
- *
- * 此过程中,如果访问到end,return 1,否则继续访问,直到遍历完成,return 0
- */
- int FindPath(Stack& maze, Stack& path, position* per, position start ,position end, int row, int col) {
-
- while (per!=&end) {//per未指向end
- //向上
- {
- per = per - col;
- if (!per && per->pos == 0 && per->step == 0) {//!per未越上边界,per->pos==0无障碍,per->step == 0未访问
- //per->pos = 1;
- //if ( per->pos == 0 && per->step == 0) {
- per->step = 1;
- Push(path, *per);
- //FindPath(maze, path, per, start,end, row, col);
- if (FindPath(maze, path, per, start, end, row, col)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- else
- per = per + col;
- }
- //向左
- {
- position p=*per;
- per = per - 1;
- if (!per&&p.x==per->x && per->pos == 0 && per->step == 0) {
-
- per->step = 1;
- Push(path, *per);
-
- if (FindPath(maze, path, per, start, end, row, col)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- else
- per = per + 1;
- }
- //向下
- {
- per = per + col;
- if (!(per->x==0&&per->y==0&&per->pos==1) && per->pos == 0 && per->step == 0) {
- per->step = 1;
- Push(path, *per);
- if (FindPath(maze, path, per, start, end, row, col)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- else
- per = per - col;
- }
- //右
- {
- position p=*per;
- per = per + 1;
- if (!(per->x == 0 && per->y == 0 && per->pos == 1)&&p.x==per->x && per->pos == 0 && per->step == 0) {
- //p.x==per->x未到右界,per->pos==0无障碍且未访问
- per->step = 1;
- Push(path, *per);
- if (FindPath(maze, path, per, start, end, row, col)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- else
- per = per - 1;
- }
- // 1,per==end,结束,有通路,,return 1
- // 2,per!=end,回退:pop(FindPath,tem),(maze.base + (tem.x * row + tem.y))->step = -1
- //退一格看一眼 上左下右
- //FindPath(maze, FindPath, per, end, row, col);
- // 直到per==end,有通路,结束
- // 或者back==start,无通路,结束
- {
- if (per->x == end.x && per->y == end.y) {
- return 1;
- }
- else {
- position tem;
- Pop(path, tem);
- //cout << (path.top - 1)->x<< (path.top - 1)->y<<"\t";//输出回退后新栈顶元素,测试Pop(),经检验POp()无误
- if (tem.x == start.x && tem.y == start.y && tem.pos == 0) {
- return 0;
- }
- else {
- per->x = (path.top - 1)->x;
- per->y = (path.top - 1)->y;
- per->pos = (path.top - 1)->pos;
- per->step = (path.top - 1)->step;
- per = maze.base + (per->x) * col + (per->y);
- if (FindPath(maze, path, per, start, end, row, col)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- }
-
- }
- }
- //per 指向了终点
- return 1;
- }
复制代码
你的代码中的问题可能是来自于内存溢出、堆栈溢出、数组越界等问题,但是不幸的是,根据你的问题描述,很难确定确切的错误来源。这里有一些我觉得可能存在问题的地方:
1. 边界检查问题:你在处理“向上”、“向左”、“向下”、“向右”方向的时候,并没有进行充分的边界检查。比如在“向上”操作中,你是通过减去一个“列”数量的值来向上移动的,但是并没有判断当前位置是否在第一行,可能会导致越界访问。同理,“向左”、“向右”也存在同样的问题。
2. 内存管理问题:在main()函数中,你使用了 new 创建了一个 position 对象的指针,但是在函数结束的时候并没有释放它。并且在 FindPath() 函数的递归调用中也没有释放这个指针。这可能会导致内存泄漏。
3. 空指针访问:在 FindPath() 函数中, while(per!=&end) 的判断可能会出现问题。因为 per 可能不会指向 end ,这可能会造成无限循环。同时,如果 per 成为了空指针,程序可能会崩溃。
我建议你按照以下步骤进行调试:
1. 确保没有越界访问:对于每一次访问数组或者指针操作,都要确保没有越过其边界。
2. 检查内存管理:确保为每一个使用 new 分配的内存都有一个相应的 delete 来释放它。
3. 检查指针的有效性:在使用指针之前,确保它们已经被正确初始化并且没有被意外修改。
希望这些建议能对你有所帮助。如果还有其他的错误或者更详细的错误信息,欢迎继续提问。
|
|