关于用栈实现迷宫求解的出栈问题

HJ_sky 2018-04-27 03:02:06
这个功能是实现了栈对于迷宫的求解,先建立一个迷宫,0是墙,1是路,3是出口,遍历四个方向,有可前进的路,当前位置进栈,然后继续求解,如果此路是死路,进行退栈操作,找到下一条路,但是我的这个程序在找到第一条死路,进行退栈的时候,直接程序就结束了,自己也找不到问题,所以希望大佬帮忙看一下



<code>

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include< stack >
using namespace std;

//空格为迷宫路径
//“O”为终点
//“#”为障碍物


struct coo //坐标模块
{
int x;
int y;
};

struct element{
int x;
int y;
int di; //下一步的方向,1,2,3,4分别为上,右,下,左
};

typedef struct mapStack //链栈
{
element elem;
struct mapStack *next;
}*MapStack;


int InitStack(MapStack &S){
S = NULL;
return 1;
}

int StackEmpty(MapStack &S){
if (S==NULL){
return 1;
}
else{
return 0;
}
}

int Push(MapStack &S, element e){
MapStack p;
p = (MapStack)malloc(sizeof(mapStack));
p->elem = e;
p->next = S;
S = p;
return 1;
}

int Pop(MapStack &S, element &e) //栈顶元素出栈
{
MapStack p;
if (!StackEmpty(S))
{
e = S->elem;
p = S;
S = S->next;
free(p);
return 1;
}
else
return 0;
}
/*
0000000000
0110111010
0110111010
0111100110
0100011110
0111011110
0101110110
0100010010
0011111130
0000000000
*/


void mazePath(){
int flag = 0;
int maze[10][10] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 0, 1, 1, 1, 0, 1, 0 }, { 0, 1, 1, 0, 1, 1, 1, 0, 1, 0 }, { 0, 1, 1, 1, 1, 0, 0, 1, 1, 0 }, { 0, 1, 0, 0, 0, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 0, 1, 1, 1, 1, 0 }, { 0, 1, 0, 1, 1, 1, 0, 1, 1, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 1, 0 }, { 0, 0, 1, 1, 1, 1, 1, 1, 3, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
int a, b,dia;
int i, j;
int add[4][2] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } };
struct coo start, end;
MapStack s1;
MapStack s2;
InitStack(s1);
InitStack(s2);
element e, elem;
start.x = 1;
start.y = 1;
end.x = 9;
end.y = 9;

maze[start.x][start.y] = 3;


elem.x = start.x;
elem.y = start.y;
elem.di = -1;
Push(s1, elem);
while (!StackEmpty(s1)){
Pop(s1, elem);
i = elem.x;
j = elem.y;
dia = elem.di + 1;
while (dia < 4){
a = i + add[dia][0];
b = j + add[dia][1];
cout << maze[a][b];
if (maze[a][b]==0){
dia++;
flag++;
}
else if (maze[a][b] == 1){
elem.x = a;
elem.y = b;
elem.di = -1;
maze[i][j] = 2;
Push(s1,elem);
dia=5;
}
else if (maze[a][b] == 2){
dia++;
flag++;
}
else if (maze[a][b]==3){
while (s1){
Pop(s1,e);
Push(s2,e);
}
while (s2){
Pop(s2, e);
printf("----->%d,%d,%d/n", e.x, e.y, e.di);
}
break;
}
}

if (flag==4){
maze[i][j] == 0;
Pop(s1,e);
flag = 0;
}
else {
flag = 0;
}

}
}











void printMap(){
cout << "#" << "#" << "#" << "#" << "#" << "#" << "#" << "#" << "#" << "#" << endl;
cout << "#" << " " << " " << "#" << " " << " " << " " << "#" << " " << "#" << endl;
cout << "#" << " " << " " << "#" << " " << " " << " " << "#" << " " << "#" << endl;
cout << "#" << " " << " " << " " << " " << "#" << "#" << " " << " " << "#" << endl;
cout << "#" << " " << "#" << "#" << "#" << " " << " " << " " << " " << "#" << endl;
cout << "#" << " " << " " << " " << "#" << " " << " " << " " << " " << "#" << endl;
cout << "#" << " " << "#" << " " << " " << " " << "#" << " " << " " << "#" << endl;
cout << "#" << " " << "#" << "#" << "#" << " " << "#" << "#" << " " << "#" << endl;
cout << "#" << "#" << " " << " " << " " << " " << " " << " " << "O" << "#" << endl;
cout << "#" << "#" << "#" << "#" << "#" << "#" << "#" << "#" << "#" << "#" << endl;
}


/*
0000000000
0110111010
0110111010
0111100110
0100011110
0111011110
0101110110
0100010010
0011111120
0000000000
*/







int main(){
//printMap();
mazePath();
}


</code>
...全文
1188 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
HJ_sky 2018-05-03
  • 打赏
  • 举报
回复
引用 8 楼 zhouqunhai 的回复:
代码风格看的眼睛疼
哪里有不好的地方,希望可以指正
zhouqunhai 2018-04-27
  • 打赏
  • 举报
回复
代码风格看的眼睛疼
paschen 版主 2018-04-27
  • 打赏
  • 举报
回复
单步跟踪程序运行,观察程序的执行流程,看哪你与你期望的不一致,分析原因
HJ_sky 2018-04-27
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
maze[i][j] == 0; 应该要改成 maze[i][j] = 0; 吧?
是的是的
HJ_sky 2018-04-27
  • 打赏
  • 举报
回复
引用 1 楼 feroncomapny 的回复:
且不论别的,光是代码风格就让人想说两句,大括号要么换行,要么不换行,一个程序有两种风格,大忌。 第二, 你用的CPP的代码,struct是不用显示标出的,更不用typedef
以后会注意的,谢谢提醒
赵4老师 2018-04-27
  • 打赏
  • 举报
回复
关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
paschen 版主 2018-04-27
  • 打赏
  • 举报
回复
maze[i][j] == 0; 应该要改成 maze[i][j] = 0; 吧?
feroncomapny 2018-04-27
  • 打赏
  • 举报
回复
且不论别的,光是代码风格就让人想说两句,大括号要么换行,要么不换行,一个程序有两种风格,大忌。 第二, 你用的CPP的代码,struct是不用显示标出的,更不用typedef
feroncomapny 2018-04-27
  • 打赏
  • 举报
回复
https://download.csdn.net/download/feroncomapny/10168767 本人做的寻路小游戏,希望有帮助

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧