简单回溯走迷宫问题,运行似乎有些错误。

summerYe 2010-03-05 09:53:43
#include<stdio.h>
#include<stdlib.h>
struct stackNode
{
int x;
int y;
struct stackNode *next;
};
typedef struct stackNode stacklist;
typedef stacklist *link;
int path = NULL;//路径栈指针
link push(link stack,int x,int y)//入栈
{
link newNode;
newNode = (link) malloc(sizeof(stacklist));
if(!newNode)
{
printf("分配内存失败!");
return NULL;
}
newNode->x = x;
newNode->y = y;
newNode->next = stack;
stack = newNode;
return stack;
}
link pop(link stack,int *x,int *y)//出栈
{
link top;
if(stack!= NULL)
{
top = stack;
stack = stack->next;
*x = stack->x;//是否应该改成top->x?
*y = stack->y;
free(top);
return stack;
}
else
*x = -1;
}
int main()
{
int maze[7][10]=//迷宫最外面即数组最外一层全部为1表示已经是外面了0表示能穿过,1表示柱子不能走
{
1,1,1,1,1,1,1,1,1,1,
1,0,1,0,1,0,0,0,0,1,
1,0,1,0,1,0,1,1,0,1,
1,0,1,0,1,1,1,0,0,1,
1,0,1,0,0,0,0,0,1,1,
1,0,0,0,1,1,1,0,0,1,
1,1,1,1,1,1,1,1,1,1
};
int i,j;
int x = 5;
int y = 8;//迷宫出口为左下角a[1][1],入口为右下角a[5][8]
while ( x!=1||y!=1 )
{
maze[x][y] =2;//2表示走过的路
if(maze[x-1][y]<=0)//向上走
{
x = x-1;
path = push(path,x,y);//系统说这里形参不配,为什么?
}
else
if( maze[x+1][y]<=0)//向下
{
x =x+1;
path = push(path,x,y);
}
else
if(maze[x][y-1]<=0)//向左
{
y = y-1;
path = push(path,x,y);
}
else
if(maze[x][y+1]<=0)//向右
{
y = y+1;
path = push(path,x,y);
}
else
{
maze[x][y] =3;//3表示绝路要回溯
path = pop(path,&x,&y);
}
}
maze[x][y] = 2;
printf("迷宫的路径如下图:\n");
for(i = 1;i<6;i++)
{
for(j=1;j<9;j++)
printf("%d",maze[i][j]);
printf("\n");
}
return 0;
}
有几个问题在注释上,走路默认顺序是上下左右。0通,1阻。
还有个问题是当走到a[2][5]的时候此时maze[2][5] = 3;表回溯。此时再怎么办呢,是不是将此结点删除然后返回a[2][5]?但再回到a[2][5]后此时怎么判断?还能不能又下到maze[2][5]?似乎不能,因为已经删掉了,但当判断if(a[x+1][5]怎么确定怎么办?
多谢。

...全文
98 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shaotine_wu 2010-03-06
  • 打赏
  • 举报
回复
21313333
21313113
21311133
21222221
22211122
意思应该是:2是通路,可以走的,3是表示遍历过的但是行不通需要回溯的路。矩阵中的1是表示遍历到的路,但是该方向是行不通的又不需要回溯的路。
tan625747 2010-03-06
  • 打赏
  • 举报
回复
top = stack;
stack = stack->next;
*x = stack->x;//是否应该改成top->x?

应该不需要

输出结果为


迷宫的路径如下图:
21313333
21313113
21311133
21222221
22211122


看不懂?
tan625747 2010-03-06
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

struct stackNode
{
int x;
int y;
struct stackNode *next;
};

typedef struct stackNode stacklist;
typedef stacklist *link;
link path = NULL;//路径栈指针 //
link push(link stack,int x,int y)//入栈
{
link newNode;
newNode = (link) malloc(sizeof(stacklist));
if(!newNode)
{
printf("分配内存失败!");
return NULL;
}
newNode->x = x;
newNode->y = y;
newNode->next = stack;
stack = newNode;
return stack;
}
link pop(link stack,int *x,int *y)//出栈
{
link top;
if(stack!= NULL)
{
top = stack;
stack = stack->next;
*x = stack->x;//是否应该改成top->x?
*y = stack->y;
free(top);
return stack;
}
else
*x = -1;
}
int main()
{
int maze[7][10]=//迷宫最外面即数组最外一层全部为1表示已经是外面了0表示能穿过,1表示柱子不能走
{
1,1,1,1,1,1,1,1,1,1,
1,0,1,0,1,0,0,0,0,1,
1,0,1,0,1,0,1,1,0,1,
1,0,1,0,1,1,1,0,0,1,
1,0,1,0,0,0,0,0,1,1,
1,0,0,0,1,1,1,0,0,1,
1,1,1,1,1,1,1,1,1,1
};
int i,j;
int x = 5;
int y = 8;//迷宫出口为左下角a[1][1],入口为右下角a[5][8]
while ( x!=1||y!=1 )
{
maze[x][y] =2;//2表示走过的路
if(maze[x-1][y] <=0)//向上走
{
x = x-1;
path = ::push (path,x,y);//系统说这里形参不配,为什么?
}
else
if( maze[x+1][y] <=0)//向下
{
x =x+1;
path = push(path,x,y);
}
else
if(maze[x][y-1] <=0)//向左
{
y = y-1;
path = push(path,x,y);
}
else
if(maze[x][y+1] <=0)//向右
{
y = y+1;
path = push(path,x,y);
}
else
{
maze[x][y] =3;//3表示绝路要回溯
path = pop(path,&x,&y);
}
}
maze[x][y] = 2;
printf("迷宫的路径如下图:\n");
for(i = 1;i <6;i++)
{
for(j=1;j <9;j++)
printf("%d",maze[i][j]);
printf("\n");
}
return 0;
}
link path = NULL;//路径栈指针 //
summerYe 2010-03-06
  • 打赏
  • 举报
回复
哦,我这里是将数组遍历看作一个栈,但到绝路的时候退出后不知道再怎么判断了。还有那个结点也应该删除了吧?
musiclee 2010-03-05
  • 打赏
  • 举报
回复
树的深度遍历呗。。。。。邻接矩阵的操作而言,
reFreever 2010-03-05
  • 打赏
  • 举报
回复
path = push(path,x,y);//系统说这里形参不配,为什么?
path你定义的是int 型,而stack 是结构指针类型,改过就行了.

还有注释那里的stack->next是否应该改成top->next?
这里不用改,因为要返回上一步,不是栈顶元素。

还有个问题是当走到a[2][5]的时候此时maze[2][5] = 3;表回溯。此时再怎么办呢,是不是将此结点删除然后返回a[2][5]?但再回到a[2][5]后此时怎么判断?还能不能又下到maze[2][5]?似乎不能,因为已经删掉了,但当判断if(a[x+1][5]怎么确定怎么办?
在回溯时maze[2][5]已经赋值为3,你删除只是去掉了在栈顶的元素,而判断的是数组中的值,没连系。
summerYe 2010-03-05
  • 打赏
  • 举报
回复
还有注释那里的stack->next是否应该改成top->next?
summerYe 2010-03-05
  • 打赏
  • 举报
回复
论坛没有打印好数组第二行应该向左和其它行靠在 一起,即:
1,1,1,1,1,1,1,1,1,1,
1,0,1,0,1,0,0,0,0,1,
1,0,1,0,1,0,1,1,0,1,
1,0,1,0,1,1,1,0,0,1,
1,0,1,0,0,0,0,0,1,1,
1,0,0,0,1,1,1,0,0,1,//我们以右下角a[5][8]出发。出口是a[1][1]最外环层的11111表示已经出来了
1,1,1,1,1,1,1,1,1,1
summerYe 2010-03-05
  • 打赏
  • 举报
回复
请各位帮忙看看。其实是简单数组问题。(多谢帮忙)

64,654

社区成员

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

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