鱼C论坛

 找回密码
 立即注册
查看: 1408|回复: 10

[已解决]迷宫问题

[复制链接]
发表于 2023-7-2 16:43:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 墨笠阳 于 2023-7-9 09:35 编辑


调试时,有些数据运行结果是对的,但会报这个错误,有些数据运行结果有误,求大佬不吝指教
  1. #define MAX_STACK_FindPath_SIZE 1275
  2. #define MAX_ROW 50
  3. #define MAX_COL 50


  4. //位置
  5. typedef struct  position {
  6.         int x = 0;
  7.         int y = 0;
  8.         int pos = 1;//1,有障碍        0 无障碍        
  9.         int step = 0;//1 已访问 0 未访问,-1 回退时再次访问
  10. }position;

  11. typedef struct {
  12.         position* base;
  13.         position* top;
  14.         int stacksize;
  15. }Stack;

  16. //初始化
  17. int InitStack_FindPath(Stack& S) {
  18.         S.base = new position[MAX_STACK_FindPath_SIZE];
  19.         if (!S.base)
  20.                 return 0;
  21.         else {
  22.                 S.top = S.base;
  23.                 S.stacksize = MAX_STACK_FindPath_SIZE;
  24.                 return 1;
  25.         }
  26. }

  27. int InitStack_maze(Stack& S) {
  28.         int max = MAX_ROW * MAX_COL;
  29.         S.base = new position[max];
  30.         if (!S.base)
  31.                 return 0;
  32.         else {
  33.                 S.top = S.base;
  34.                 S.stacksize = max;
  35.                 return 1;
  36.         }
  37. }

  38. //入栈
  39. int Push(Stack& S, position p) {
  40.         if (S.top - S.base == S.stacksize)//栈满
  41.                 return 0;
  42.         else {               
  43.                 *S.top = p;
  44.                 S.top++;
  45.                 return 1;
  46.         }
  47. }

  48. //出栈
  49. int Pop(Stack& S, position& p) {
  50.         if (S.top == S.base)
  51.                 return 0;
  52.         else {
  53.                
  54.                 p = *(S.top - 1);

  55.                 /*
  56.                 p.x = (S.top - 1)->x;
  57.                 p.y = (S.top - 1)->y;
  58.                 p.pos = (S.top - 1)->pos;/**/
  59.                 S.top--;
  60.                 return 1;
  61.         }
  62. }
  63. #include <iostream>
  64. #include <malloc.h>
  65. #include"struct.h"
  66. using namespace std;

  67. void Creat_maze(int row, int col, Stack& maze);
  68. int FindPath(Stack& maze, Stack& pass, position* p,position start, position end, int row, int col);
  69. int main() {
  70.         position* p;//指向当前起点的指针
  71.         Stack path;//通路
  72.         Stack maze;//迷宫
  73.         int m, n;//行、列
  74.         
  75.         //初始化指针p
  76.         do {
  77.                 p = new position;
  78.         } while (!p);
  79.         //初始化path栈、maze栈
  80.         InitStack_FindPath(path);
  81.         InitStack_maze(maze);

  82.         cout << "迷宫规格m*n:\n" << "请输入m,n的值\n" << endl;
  83.         cin >> m >> n;

  84.         position start = { 0 ,0 ,0 };//入口
  85.         position end = { m - 1 , n - 1, 0 };//出口

  86.         cout << "\n1 表示不可通行,0 表示可通行\n" ;
  87.         cout << "默认入口为第一个元素,出口为最后一个元素," << "请输入迷宫元素\n" << endl;

  88.         //构建迷宫m*n
  89.         Creat_maze(m, n, maze);

  90.         p = maze.base;
  91.         Push(path, *p);

  92.         if (FindPath(maze,path, p,start, end, m, n)) {
  93.                 p = path.base;
  94.                 cout << "通道为:" << endl;
  95.                 while (p != path.top) {
  96.                         cout << "\t(" << p->x << "," << p->y << ")" << endl;
  97.                         p++;
  98.                 }
  99.                 delete p;
  100.                 return 1;
  101.         }
  102.         else {
  103.                 cout << "此迷宫无通路!" << endl;
  104.                 delete p;
  105.                 return 0;
  106.         }

  107. }
  108. void Creat_maze(int row, int col, Stack& maze) {
  109.         int i, j;
  110.         position p;

  111.         for (i = 0; i < row; i++) {
  112.                
  113.                 p.x = i;
  114.                 for (j = 0; j < col; j++) {
  115.                         p.y = j;
  116.                         cin >> p.pos;
  117.                         Push(maze, p);                        
  118.                 }               
  119.         }
  120.         
  121. }

  122. /*
  123. * 通道函数:
  124. *        从起点出发,将起点入栈,标记其为已访问,然后依次对当前位置上,左,下,右进行深度遍历,
  125. *        .1.若 p 所指的 position 的 上(左下右)可通,即 pos=0,且未被访问,即pos=0,则入栈pass
  126. *   p.step=1 ,将新位置设为新起点,继续遍历,直到无前路
  127. *
  128. *        此过程中,如果访问到end,return 1,否则继续访问,直到遍历完成,return 0
  129. */
  130. int FindPath(Stack& maze, Stack& path, position* per, position start ,position end, int row, int col) {
  131.         
  132.         while (per!=&end) {//per未指向end
  133.                 //向上
  134.                 {
  135.                         per = per - col;
  136.                         if (!per && per->pos == 0 && per->step == 0) {//!per未越上边界,per->pos==0无障碍,per->step == 0未访问
  137.                                                         //per->pos = 1;
  138.                         //if (  per->pos == 0 && per->step == 0) {
  139.                                 per->step = 1;
  140.                                 Push(path, *per);
  141.                                                 //FindPath(maze, path, per, start,end, row, col);
  142.                                 if (FindPath(maze, path, per, start, end, row, col)) {
  143.                                         return 1;
  144.                                 }
  145.                                 else {
  146.                                         return 0;
  147.                                 }
  148.                         }
  149.                         else
  150.                                 per = per + col;
  151.                 }
  152.                 //向左
  153.                 {
  154.                         position p=*per;
  155.                         per = per - 1;
  156.                         if (!per&&p.x==per->x && per->pos == 0 && per->step == 0) {
  157.                                 
  158.                                 per->step = 1;
  159.                                 Push(path, *per);
  160.                                 
  161.                                 if (FindPath(maze, path, per, start, end, row, col)) {
  162.                                         return 1;
  163.                                 }
  164.                                 else {
  165.                                         return 0;
  166.                                 }
  167.                         }
  168.                         else
  169.                                 per = per + 1;
  170.                 }
  171.                 //向下
  172.                 {
  173.                         per = per + col;
  174.                         if (!(per->x==0&&per->y==0&&per->pos==1) && per->pos == 0 && per->step == 0) {
  175.                                 per->step = 1;
  176.                                 Push(path, *per);                                
  177.                                 if (FindPath(maze, path, per, start, end, row, col)) {
  178.                                         return 1;
  179.                                 }
  180.                                 else {
  181.                                         return 0;
  182.                                 }
  183.                         }
  184.                         else
  185.                                 per = per - col;
  186.                 }
  187.                 //右
  188.                 {
  189.                         position p=*per;
  190.                         per = per + 1;
  191.                         if (!(per->x == 0 && per->y == 0 && per->pos == 1)&&p.x==per->x && per->pos == 0 && per->step == 0) {
  192.                                 //p.x==per->x未到右界,per->pos==0无障碍且未访问
  193.                                 per->step = 1;
  194.                                 Push(path, *per);                        
  195.                                 if (FindPath(maze, path, per, start, end, row, col)) {
  196.                                         return 1;
  197.                                 }
  198.                                 else {
  199.                                         return 0;
  200.                                 }
  201.                         }
  202.                         else
  203.                                 per = per - 1;
  204.                 }
  205.                 // 1,per==end,结束,有通路,,return 1
  206.                 // 2,per!=end,回退:pop(FindPath,tem),(maze.base + (tem.x * row + tem.y))->step = -1
  207.                 //退一格看一眼 上左下右
  208.                 //FindPath(maze, FindPath, per, end, row, col);
  209.                 // 直到per==end,有通路,结束
  210.                 // 或者back==start,无通路,结束
  211.                 {
  212.                         if (per->x == end.x && per->y == end.y) {                                
  213.                                 return 1;                                
  214.                         }
  215.                         else {
  216.                                 position tem;
  217.                                 Pop(path, tem);
  218.                                 //cout << (path.top - 1)->x<< (path.top - 1)->y<<"\t";//输出回退后新栈顶元素,测试Pop(),经检验POp()无误
  219.                                 if (tem.x == start.x && tem.y == start.y && tem.pos == 0) {
  220.                                         return 0;
  221.                                 }                                
  222.                                 else {                                                                        
  223.                                         per->x = (path.top - 1)->x;
  224.                                         per->y = (path.top - 1)->y;
  225.                                         per->pos = (path.top - 1)->pos;
  226.                                         per->step = (path.top - 1)->step;
  227.                                         per = maze.base + (per->x) * col + (per->y);                        
  228.                                         if (FindPath(maze, path, per, start, end, row, col)) {
  229.                                                 return 1;
  230.                                         }
  231.                                         else {
  232.                                                 return 0;
  233.                                         }
  234.                                 }
  235.                         }
  236.                         
  237.                 }

  238.         }

  239.         //per 指向了终点
  240.         return 1;

  241. }
复制代码
最佳答案
2023-7-2 16:46:06
你的代码中的问题可能是来自于内存溢出、堆栈溢出、数组越界等问题,但是不幸的是,根据你的问题描述,很难确定确切的错误来源。这里有一些我觉得可能存在问题的地方:

1. 边界检查问题:你在处理“向上”、“向左”、“向下”、“向右”方向的时候,并没有进行充分的边界检查。比如在“向上”操作中,你是通过减去一个“列”数量的值来向上移动的,但是并没有判断当前位置是否在第一行,可能会导致越界访问。同理,“向左”、“向右”也存在同样的问题。

2. 内存管理问题:在main()函数中,你使用了 new 创建了一个 position 对象的指针,但是在函数结束的时候并没有释放它。并且在 FindPath() 函数的递归调用中也没有释放这个指针。这可能会导致内存泄漏。

3. 空指针访问:在 FindPath() 函数中, while(per!=&end) 的判断可能会出现问题。因为 per 可能不会指向 end ,这可能会造成无限循环。同时,如果 per 成为了空指针,程序可能会崩溃。

我建议你按照以下步骤进行调试:

1. 确保没有越界访问:对于每一次访问数组或者指针操作,都要确保没有越过其边界。

2. 检查内存管理:确保为每一个使用 new 分配的内存都有一个相应的 delete 来释放它。

3. 检查指针的有效性:在使用指针之前,确保它们已经被正确初始化并且没有被意外修改。

希望这些建议能对你有所帮助。如果还有其他的错误或者更详细的错误信息,欢迎继续提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-2 16:46:06 | 显示全部楼层    本楼为最佳答案   
你的代码中的问题可能是来自于内存溢出、堆栈溢出、数组越界等问题,但是不幸的是,根据你的问题描述,很难确定确切的错误来源。这里有一些我觉得可能存在问题的地方:

1. 边界检查问题:你在处理“向上”、“向左”、“向下”、“向右”方向的时候,并没有进行充分的边界检查。比如在“向上”操作中,你是通过减去一个“列”数量的值来向上移动的,但是并没有判断当前位置是否在第一行,可能会导致越界访问。同理,“向左”、“向右”也存在同样的问题。

2. 内存管理问题:在main()函数中,你使用了 new 创建了一个 position 对象的指针,但是在函数结束的时候并没有释放它。并且在 FindPath() 函数的递归调用中也没有释放这个指针。这可能会导致内存泄漏。

3. 空指针访问:在 FindPath() 函数中, while(per!=&end) 的判断可能会出现问题。因为 per 可能不会指向 end ,这可能会造成无限循环。同时,如果 per 成为了空指针,程序可能会崩溃。

我建议你按照以下步骤进行调试:

1. 确保没有越界访问:对于每一次访问数组或者指针操作,都要确保没有越过其边界。

2. 检查内存管理:确保为每一个使用 new 分配的内存都有一个相应的 delete 来释放它。

3. 检查指针的有效性:在使用指针之前,确保它们已经被正确初始化并且没有被意外修改。

希望这些建议能对你有所帮助。如果还有其他的错误或者更详细的错误信息,欢迎继续提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-2 16:46:40 | 显示全部楼层
isdkz 发表于 2023-7-2 16:46
你的代码中的问题可能是来自于内存溢出、堆栈溢出、数组越界等问题,但是不幸的是,根据你的问题描述,很难 ...

我的 gpt 显示消息太长了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-2 16:48:23 | 显示全部楼层
sfqxx 发表于 2023-7-2 16:46
我的 gpt 显示消息太长了

现在官方的gpt应该加强了,之前也不行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-2 18:03:31 | 显示全部楼层
isdkz 发表于 2023-7-2 16:48
现在官方的gpt应该加强了,之前也不行

我听说翻 墙次数多了会触犯法律规定
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-2 18:23:42 | 显示全部楼层
sfqxx 发表于 2023-7-2 18:03
我听说翻 墙次数多了会触犯法律规定

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-2 18:30:57 | 显示全部楼层

真的,所以我不敢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-2 20:28:25 | 显示全部楼层
根据您提供的代码,很可能出现“Debug Assertion Failed”的原因是访问了无效的内存地址。这可能是由于在使用Pop函数时,出栈时访问了已被删除的指针的错误。

在FindPath函数的回退部分,您使用了Pop函数将栈顶元素弹出,并将其赋值给per指针。但是,在此之后,您又尝试通过per->x和per->y访问已经出栈的位置。这可能导致访问无效的内存。

要解决这个问题,您可以在执行Pop函数之前将栈顶元素保存到临时变量中,然后使用临时变量进行相关操作。

下面是对FindPath函数回退部分的修改:

  1. {
  2.     if (per->x == end.x && per->y == end.y) {
  3.         return 1;
  4.     }
  5.     else {
  6.         position tem;
  7.         Pop(path, tem);
  8.         if (tem.x == start.x && tem.y == start.y && tem.pos == 0) {
  9.             return 0;
  10.         }
  11.         else {
  12.             per = path.top - 1;  // 使用栈顶元素进行回退
  13.             per = maze.base + (per->x) * col + (per->y);
  14.             if (FindPath(maze, path, per, start, end, row, col)) {
  15.                 return 1;
  16.             }
  17.             else {
  18.                 return 0;
  19.             }
  20.         }
  21.     }
  22. }
复制代码


通过上述修改,应该可以避免访问无效的内存地址,并解决“Debug Assertion Failed”的问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-2 22:17:27 | 显示全部楼层
sfqxx 发表于 2023-7-2 18:30
真的,所以我不敢

www.github.com/dddddgz/cn-internet-bad

###为了不使论坛被墙掉发在github###
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-3 10:28:01 | 显示全部楼层
根据提供的代码,我注意到您在 `FindPath` 函数中存在一个问题。在递归调用 `FindPath` 时,您在参数列表中将 `per` 传递给了 `end`,导致了不正确的递归调用。这会导致结果出错或产生异常。

下面是相关代码片段,我已经标出了问题所在:

  1. //错误的递归调用
  2. if (FindPath(maze, path, per, end, row, col)) {
  3.     return 1;
  4. }
  5. else {
  6.     return 0;
  7. }
复制代码


为了修复这个问题,您应该将 `end` 替换为 `start`,如下所示:

  1. if (FindPath(maze, path, per, start, end, row, col)) {
  2.     return 1;
  3. }
  4. else {
  5.     return 0;
  6. }
复制代码


此外,还有几个注意事项:

1. 在 `Creat_maze` 函数中,您可以将 `Push(maze, p);` 放在内循环之外,以避免重复入栈。

2. 在 `FindPath` 函数中,`per = per + col;` 和 `per = per - col;` 这两行代码的位置需要调整,以确保在计算新位置之前将 `per` 恢复到原始位置。

请注意这些修正,并再次运行您的代码进行测试。

如果回答对你有帮助,给个最佳答案吧,求求了

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-9 09:33:08 | 显示全部楼层
isdkz 发表于 2023-7-2 16:46
你的代码中的问题可能是来自于内存溢出、堆栈溢出、数组越界等问题,但是不幸的是,根据你的问题描述,很难 ...

谢谢您的回复,经过调试,我发现
1.初始化栈时,确实成功开辟了数组空间,可是指向栈内元素的指针 p 和 per,在 p = maze.base 之后,也为空,导致运行时 per 始终不向上和向左遍历
2.发生数组越界时,向上越界多为设定的position类型元素的默认值,向左越界时多为随机数值,如x= 40000        y= 0    pos= 153        step= -33686019,不知道为什么
3.内存管理问题:原先我使用new 开辟了一个position类型大小的空间,并将其首地址赋给了p,经过您的提醒,我检查了全文,补全了delete,可是仍然报了“Debug Assertion Failed”的错误,后来误打误撞把
p = new position;
        while (!p) {
                delete p;
                p = new position;
                //最终这个p将在程序结束时delete
        }
及对应的delete删除,未报该错误了,却不知道是为什么
4.在 FindPath()函数中, while(per!=&end)的判断确实可能出现问题了,因为&end未声明是maze栈出口的地址,只是存放了出口的 x , y ,pos 等信息,现已将 end 和 start 改成指针类型,并使其分别指向 maze 栈的出口和入口
以上是我的新困惑,请不吝赐教
以下为修改后的代码
  1. #include<malloc.h>
  2. #define MAX_STACK_FindPath_SIZE 1275
  3. #define MAX_ROW 50
  4. #define MAX_COL 50


  5. //位置
  6. typedef struct  position {
  7.     int x = 0;
  8.     int y = 0;
  9.     int pos = 1;//1,有障碍        0 无障碍        
  10.     int step = 0;//1 已访问 0 未访问,-1 回退时再次访问
  11. }position;

  12. typedef struct {
  13.     position* base;
  14.     position* top;
  15.     int stacksize;
  16. }Stack;

  17. //初始化
  18. int InitStack_FindPath(Stack& S) {
  19.     S.base = new position[MAX_STACK_FindPath_SIZE];
  20.     if (!S.base)
  21.         return 0;
  22.     else {
  23.         S.top = S.base;
  24.         S.stacksize = MAX_STACK_FindPath_SIZE;
  25.         return 1;
  26.     }
  27. }

  28. int InitStack_maze(Stack& S) {
  29.     int max = MAX_ROW * MAX_COL;
  30.     S.base = new position[max];
  31.     if (!S.base)
  32.         return 0;
  33.     else {
  34.         S.top = S.base;
  35.         S.stacksize = max;
  36.         return 1;
  37.     }
  38. }

  39. //入栈
  40. int Push(Stack& S, position p) {
  41.     if (S.top - S.base == S.stacksize)//栈满
  42.         return 0;
  43.     else {
  44.         *S.top = p;
  45.         S.top++;
  46.         return 1;
  47.     }
  48. }

  49. //出栈
  50. int Pop(Stack& S, position& p) {
  51.     if (S.top == S.base)
  52.         return 0;
  53.     else {
  54.         p = *(S.top - 1);
  55.         S.top--;
  56.         return 1;
  57.     }
  58. }
  59. #include<iostream>
  60. #include"struct.h"
  61. using namespace std;

  62. void Creat_maze(Stack& maze, int row,int col);
  63. int FindPath(Stack& maze, Stack& path, position* p, position* start,position* end,int row,int col);
  64. int main() {
  65.         Stack maze;
  66.         Stack path;
  67.         position* p;
  68.         position* start, * end;
  69.         int row, col;
  70.         InitStack_FindPath(path);
  71.         InitStack_maze(maze);
  72.         cout << "请输入行数:" ;
  73.         cin >> row;
  74.         cout << "\n请输入列数:";
  75.         cin >> col;
  76.         cout << endl;
  77.         Creat_maze(maze,row,col);
  78.         start = maze.base;
  79.         end = maze.top - 1;
  80.         p = maze.base;

  81.         if (p) {
  82.                 cout << "NULL";
  83.                 cout << "\tx= " << p->x << "\ty= " << p->y << "\tpos= " << p->pos << "\tstep= " << p->step << endl;
  84.         }

  85.         p->step = 1;
  86.         if (FindPath(maze, path, p, start,end,row, col)) {
  87.                 p = path.base;
  88.                 while (p!=path.top) {                       
  89.                         cout << "(" << p->x << "," << p->y << ")" << endl;
  90.                         p++;
  91.                 }
  92.                 return 1;
  93.         }
  94.         else {
  95.                 cout << "此迷宫无通路!" << endl;               
  96.                 return 0;
  97.         }
  98. }
  99. void Creat_maze(Stack& maze, int row, int col) {
  100.         int i, j;
  101.         position p;
  102.         for (i = 0; i < row; i++) {
  103.                 p.x = i;
  104.                 for (j = 0; j < col; j++) {
  105.                         p.y = j;
  106.                         cin >> p.pos;
  107.                         Push(maze, p);
  108.                 }
  109.         }
  110. }
  111. int FindPath(Stack& maze, Stack& path, position* p,  position* start, position* end, int row, int col) {
  112.         position* per;
  113.          {
  114.                 //向上
  115.                 {
  116.                         per = p - col;
  117.                         //验证per是否空
  118.                         /**
  119.                         if (per) {
  120.                                 cout << "NULL";
  121.                                 cout << "\tx= " << per->x << "\ty= " << per->y << "\tpos= " << per->pos << "\tstep= " << per->step<<endl;
  122.                         }/**/
  123.                         /**
  124.                         if (p) {
  125.                                 cout << "NULL";
  126.                                 cout << "\tx= " << per->x << "\ty= " << per->y << "\tpos= " << per->pos << "\tstep= " << per->step << endl;
  127.                         }/**/
  128.                         if (!per && per->pos == 0 && per->step == 0) {
  129.                                 //!per 未越上边界
  130.                                 //per->pos == 0 无障碍
  131.                                 //per->step == 0 未被访问
  132.                                 Push(path, *per);
  133.                                 per->step = 1;
  134.                                 if (FindPath(maze, path, per, start, end, row, col)) {
  135.                                         return 1;
  136.                                 }
  137.                                 else {
  138.                                         return 0;
  139.                                 }
  140.                         }
  141.                 }
  142.                 //向左
  143.                 {
  144.                         per = p - 1;
  145.                         /*
  146.                         if (per) {
  147.                                 cout << "NULL";
  148.                                 cout << "\tx= " << per->x << "\ty= " << per->y << "\tpos= " << per->pos << "\tstep= " << per->step << endl;
  149.                         }/**/
  150.                         if (!per && p->x == per->x && per->pos == 0 && per->step == 0) {
  151.                                 //!per && p->x == per->x 未越界
  152.                                 Push(path, *per);
  153.                                 per->step = 1;
  154.                                 if (FindPath(maze, path, per, start, end, row, col)) {
  155.                                         return 1;
  156.                                 }
  157.                                 else {
  158.                                         return 0;
  159.                                 }
  160.                         }
  161.                        
  162.                 }
  163.                 //向下
  164.                 {
  165.                         per = p + col;
  166.                         if (!(per->x == 0 && per->y == 0 && per->pos == 1) && per->pos == 0 && per->step == 0) {
  167.                                 //per->x == 0 && per->y == 0 && per->pos == 1 是position类型元素的默认值,表示maze栈外元素
  168.                                 Push(path, *per);
  169.                                 per->step = 1;
  170.                                 if (FindPath(maze, path, per, start, end, row, col)) {
  171.                                         return 1;
  172.                                 }
  173.                                 else {
  174.                                         return 0;
  175.                                 }
  176.                         }
  177.                 }
  178.                 //向右
  179.                 {
  180.                         per = p + 1;
  181.                         if (p->x == per->x && !(per->x == 0 && per->y == 0 && per->pos == 1) && per->pos == 0 && per->step == 0) {
  182.                                 Push(path, *per);
  183.                                 per->step = 1;
  184.                                 if (FindPath(maze, path, per, start, end, row, col)) {
  185.                                         return 1;
  186.                                 }
  187.                                 else {
  188.                                         return 0;
  189.                                 }
  190.                         }
  191.                 }

  192.                 //判断,是出口
  193.                 if (p == end) {
  194.                         return 1;
  195.                 }
  196.                 //不是出口,回退,
  197.                         //判断,新起点是入口,return 0,F
  198.                         // 0 0 0
  199.                         // 0 1 0
  200.                         // 1 1 0
  201.                         //否,遍历,F
  202.                 //判断,回退后path栈空,return 0
  203.                 //path栈未空,以栈顶元素为新起点再遍历
  204.                 else {
  205.                         position tem;
  206.                         Pop(path, tem);
  207.                         //per = (maze.base + (tem.x * row + tem.y));
  208.                         //per = (maze.base + (path.top - 1)->x * col + (path.top - 1)->y);
  209.                         /**if (per == start) {
  210.                                 delete per;
  211.                                 return 0;
  212.                         }
  213.                         else {
  214.                                 if (FindPath(maze, path, per, start, end, row, col)) {
  215.                                         delete per;
  216.                                         return 1;
  217.                                 }
  218.                                 else {
  219.                                         delete per;
  220.                                         return 0;
  221.                                 }
  222.                         }/**/
  223.                         if (path.base == path.top) {
  224.                                 return 0;
  225.                         }
  226.                         else {
  227.                                 per = (maze.base + (path.top - 1)->x * col + (path.top - 1)->y);
  228.                                 if (FindPath(maze, path, per, start, end, row, col)) {
  229.                                         return 1;
  230.                                 }
  231.                                 else {
  232.                                         return 0;
  233.                                 }
  234.                         }
  235.                                
  236.                 }
  237.          }
  238. }

复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 08:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表