jmu第13小组作业

jmu sl 2021-04-27 09:10:57
用c实现迷宫问题(利用堆栈和递归)


#include<stdio.h>
#include<stdlib.h>
#define m 6
#define n 8
#define STACK_INIT_SIZE 100
typedef struct
{
int x,y;
}SElemType; //定义结构表示坐标

typedef struct
{
SElemType stack[STACK_INIT_SIZE];
int top;
}SqStack; //堆栈


int maze[m+2][n+2]=
{
/*0,1,2,3,4,5,6,7,8,9*/
/*0*/ {1,1,1,1,1,1,1,1,1,1},
/*1*/ {1,0,1,1,1,0,1,1,1,1},
/*2*/ {1,1,0,1,0,1,1,1,1,1},
/*3*/ {1,0,1,0,0,0,0,0,1,1},
/*4*/ {1,0,1,1,1,0,1,1,1,1},
/*5*/ {1,1,0,0,1,1,0,0,0,1},
/*6*/ {1,0,1,1,0,0,1,1,0,1},
/*7*/ {1,1,1,1,1,1,1,1,1,1},
}; //1表示有障碍 ,0表示可以过

int t[m+2][n+2]={0}; //与迷宫相同的二维数组,用来表示该条路有没有走;(很重要!!!)
SElemType Move[8]= //记录走的方向;
{
{0,1},{1,1},{1,0},{1,-1},
{0,-1},{-1,-1},{-1,0},{-1,1}
};

int sum=0; //记录有几条路径


//打印路径
void Print(int sum,SqStack a)
{
int i;
printf("迷宫的第%d条路径如下:\n",sum);
for(i=0;i<=a.top;i++)
printf("(%d,%d)->",a.stack[i].x,a.stack[i].y);
printf("出口\n\n");
printf("\n");
}


//符合规则的压入栈
void Push_SqStack(SqStack *s,SElemType x) //x是经过判断符合条件的走向
{
if(s->top==STACK_INIT_SIZE-1)
printf("\n栈满!");
else
{
s->top++;
s->stack[s->top]=x;
}
}


//检查栈是否为空
int Empty_SqStack(SqStack *s)
{
if(s->top==-1)
return 1;
else
return 0;
}


//删除栈顶的元素,退后操作
void Pop_SqStack(SqStack *s)
{
if(Empty_SqStack(s))
{
printf("\n栈空!");
exit(0);
}
else
{
s->top--;
}
}


void path(int x,int y,SqStack elem) //找出口的函数 (利用递归)
{
int i,a,b;
SElemType temp;
if(x==6&&y==8)
{
sum++;
Print(sum,elem);
}
else
{
for(i=0;i<8;i++) //遍历八个方向
{
a=x+Move[i].x;
b=y+Move[i].y;
if(!maze[a][b]&&!t[a][b]) //用t防止往回走
{
temp.x=a;temp.y=b;
t[a][b]=maze[a][b]=1; //用数组t,M记录这个位置已经走过了
Push_SqStack(&elem,temp);
path(a,b,elem); //此处开始递归!(递归的出口要么走到出口,要么循环走完也没走下一步,即走入死路需回溯)
t[a][b]=maze[a][b]=0; //回溯之后需要将这个位置清空,表示这条路没有走过
Pop_SqStack(&elem);
}
}
}
}



int main()
{
SqStack *s;
s=(SqStack *)malloc(sizeof(SqStack));
s->stack[0].x=1;
s->stack[0].y=1;
s->top=0;
t[1][1]=maze[1][1]=1;
path(1,1,*s);
return 0;

}

//代码参考CSDN某大佬
...全文
134 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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