写在前面
可解决问题:输入n,m,可随机生成n*m大小的迷宫(伪随机数),也可手动输入迷宫,找到迷宫中的所有可行路径(八个方向:上下左右以及对角),输出路径以及路径长度。
实现效果(更新)
......太多了
基本代码
(觉得麻烦可以直接跳到最后)
C语言实现栈,并打成头文件方便使用:
#ifndef stack_h
#define stack_h
#include <stdio.h>
#include <stdlib.h>
//栈中存位置以及遍历时所走的方向,打印时可以显示出来
typedef struct Node{
int x;
int y;
// int dir; //-1为左上右下对应 '\' 0为上下对应'|' 1为左右对应'——' 2为左下右上对应'/'
struct node* next;
}Node;
typedef Node* Stack; //定义数据结构栈 Stack
//-----------创建一个空栈--------------
Stack creakEmptyStack(){
Stack p;
p=(Stack)malloc(sizeof(Node)); //申请一个空间
if(p){
p->next=NULL;
return p;
}
else{
printf("No space!\n"); //申请空间失败则提示并返回空
return NULL;
}
}
//------------将元素压入栈----------------
void push(int x,int y,Stack s){
Stack p;
p=(Stack)malloc(sizeof(Node));
if(p){ //如果申请空间成功则用头插法将元素压入
p->x=x;
p->y=y;
if(!s->next) p->next=NULL; //如果此时栈里还没有任何元素,则p此时为第一个结点
else p->next=s->next; //否则将p插入头结点之后
s->next=p;
}
else{
printf("No space!\n");
}
}
//-------------检测栈是否为空--------------
int isEmpty(Stack s){ //为空则返回1,不为空返回0
if(s->next==NULL) return 1;
else return 0;
}
//--------------将元素弹出栈----------------
void pop(Stack s){
Stack p;
p=s->next;
if(p->next){
s->next=p->next;
free(p);
}
else return;
}
//------------取栈顶元素------------------
Node top(Stack s){
Node t;
//判断是否为空,若不为空则返回
t=*(s->next);
return t;
}
#endif
C语言实现迷宫的遍历并输出所有的路径:
当然这里用c++的STL库的stack也可,但是下面的代码需要做一些小小的修改。
/* filename: 数据结构实验_迷宫.c
* brife: Sovle the maze problem by using dfs&bfs
* author: HP1020--SNOOHAIRY
* date: 2019.10.18 -- Firday
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack_h"
#define MAXN 20
void mazePath(int x,int y,int endx,int endy,int n,int m,Stack s);
void printPath(Stack s,int n,int m);
/* *建立一个二维数组存迷宫
*要是八个方向能有位置则压入栈,要是下一步没有则弹出栈回溯
*直到找到终点为止
*/
int direction[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; //定义一个数组存八个方向操作数
int maze[MAXN][MAXN];
int flag=0;
int main()
{
int n,m,i,j,xa,xb,ya,yb,ox;
//--------------建立迷宫--------------
printf("请输入迷宫大小:(长、宽)\n");
scanf("%d%d",&n,&m);
if(n<=20&&m<=20){
printf("请选择构建迷宫的方式:\n0.随机生成迷宫\n1.手动输入迷宫\n"); //实际上不是0就可以手动输入
scanf("%d",&ox);
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(!ox)maze[i][j]=rand()%2; //这里为伪随机数
else scanf("%d",&maze[i][j]);
}
}
printf("\n");
//----------输出构建迷宫-------------
printf("生成的迷宫如下:\n");
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("%d ",maze[i][j]);
}
printf("\n");
}
printf("请输入起点及终点:\n");
scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
//标记起点
maze[xa-1][ya-1]=2;
//创建一个空栈
Stack s=creakEmptyStack();
//创建一个空队列
//QueueLink q=creakEmptyQueue();
mazePath(xa-1,ya-1,xb-1,yb-1,n,m,s);
if(!flag) printf("没有成功找到路径\n");
}
else printf("输入数据超出迷宫范围\n");
}
//-----------遍历迷宫寻找路径(dfs)------------
void mazePath(int x,int y,int endx,int endy,int n,int m,Stack s){
int newx,newy,i;
Node t;
for(i=0;i<8;i++){
newx=x+direction[i][0];
newy=y+direction[i][1];
if(newx>=0&&newx<n&&newy>=0&&newy<m&&maze[newx][newy]==0){ //走到出口
push(newx,newy,s);
maze[newx][newy]=2;
if(newx==endx&&newy==endy){
flag++;
printPath(s,n,m);
maze[newx][newy]=0;
pop(s);
}
else{
mazePath(newx,newy,endx,endy,n,m,s);
}
}
// else if(!isEmpty(s)) pop(s);
}
maze[x][y]=0; //遍历完八个方向之后回溯前将自己赋为空
pop(s);
}
//-------------打印迷宫路径-----------------
void printPath(Stack s,int n,int m){
int cont =0; //计算路径长度
s=s->next;
int i=0,j=0;
printf("第%d条路径为:\n",flag);
for(i=0;i<n;i++){ //按图形输出
for(j=0;j<m;j++){
if(maze[i][j]==2) printf("* ");
else printf("%d ",maze[i][j]);
}
printf("\n");
}
while(s->next){ //将栈中的元素输出为直观路径
printf("(%d,%d)->",s->x+1,s->y+1);
s=s->next;
cont++;
}
printf("(%d,%d)",s->x+1,s->y+1);
cont++;
printf("\n");
printf("路径长度为:%d\n\n",cont);
}
[不用问为啥复制粘贴执行不了,问就是没加文章开头的头文件]
写在最后(更新)
为了方便大家,我这打出来一个直接复制粘贴就可以运行的代码👨🦳
/* filename: 数据结构实验_迷宫.c
* brife: Sovle the maze problem by using dfs&bfs
* author: HP1020--SNOOHAIRY
* date: 2019.10.18 -- Firday
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 20
/* *建立一个二维数组存迷宫
*要是八个方向能有位置则压入栈,要是下一步没有则弹出栈回溯
*直到找到终点为止
*/
int direction[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; //定义一个数组存八个方向操作数
int maze[MAXN][MAXN];
int flag=0;
//栈中存位置以及遍历时所走的方向,打印时可以显示出来
typedef struct Node{
int x;
int y;
// int dir; //-1为左上右下对应 '\' 0为上下对应'|' 1为左右对应'——' 2为左下右上对应'/'
struct Node *next;
}Node;
typedef Node* Stack; //定义数据结构栈 Stack
//-----------创建一个空栈--------------
Stack creakEmptyStack(){
Stack p;
p=(Stack)malloc(sizeof(Node)); //申请一个空间
if(p){
p->next=NULL;
return p;
}
else{
printf("No space!\n"); //申请空间失败则提示并返回空
return NULL;
}
}
//------------将元素压入栈----------------
void push(int x,int y,Stack s){
Stack p;
p=(Stack)malloc(sizeof(Node));
if(p){ //如果申请空间成功则用头插法将元素压入
p->x=x;
p->y=y;
if(!s->next) p->next=NULL; //如果此时栈里还没有任何元素,则p此时为第一个结点
else p->next=s->next; //否则将p插入头结点之后
s->next=p;
}
else{
printf("No space!\n");
}
}
//-------------检测栈是否为空--------------
int isEmpty(Stack s){ //为空则返回1,不为空返回0
if(s->next==NULL) return 1;
else return 0;
}
//--------------将元素弹出栈----------------
void pop(Stack s){
Stack p;
p=s->next;
if(p->next){
s->next=p->next;
free(p);
}
else return;
}
//------------取栈顶元素------------------
Node top(Stack s){
Node t;
//判断是否为空,若不为空则返回
t=*(s->next);
return t;
}
void mazePath(int x,int y,int endx,int endy,int n,int m,Stack s);
void printPath(Stack s,int n,int m);
int main()
{
int n,m,i,j,xa,xb,ya,yb,ox;
//--------------建立迷宫--------------
printf("请输入迷宫大小:(长、宽)\n");
scanf("%d%d",&n,&m);
if(n<=20&&m<=20){
printf("请选择构建迷宫的方式:\n0.随机生成迷宫\n1.手动输入迷宫\n"); //实际上不是0就可以手动输入
scanf("%d",&ox);
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(!ox)maze[i][j]=rand()%2; //这里为伪随机数
else scanf("%d",&maze[i][j]);
}
}
printf("\n");
//----------输出构建迷宫-------------
printf("生成的迷宫如下:\n");
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("%d ",maze[i][j]);
}
printf("\n");
}
printf("请输入起点及终点:\n");
scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
//标记起点
maze[xa-1][ya-1]=2;
//创建一个空栈
Stack s=creakEmptyStack();
//创建一个空队列
//QueueLink q=creakEmptyQueue();
mazePath(xa-1,ya-1,xb-1,yb-1,n,m,s);
if(!flag) printf("没有成功找到路径\n");
}
else printf("输入数据超出迷宫范围\n");
}
//-----------遍历迷宫寻找路径(dfs)------------
void mazePath(int x,int y,int endx,int endy,int n,int m,Stack s){
int newx,newy,i;
Node t;
for(i=0;i<8;i++){
newx=x+direction[i][0];
newy=y+direction[i][1];
if(newx>=0&&newx<n&&newy>=0&&newy<m&&maze[newx][newy]==0){ //走到出口
push(newx,newy,s);
maze[newx][newy]=2;
if(newx==endx&&newy==endy){
flag++;
printPath(s,n,m);
maze[newx][newy]=0;
pop(s);
}
else{
mazePath(newx,newy,endx,endy,n,m,s);
}
}
// else if(!isEmpty(s)) pop(s);
}
maze[x][y]=0; //遍历完八个方向之后回溯前将自己赋为空
pop(s);
}
//-------------打印迷宫路径-----------------
void printPath(Stack s,int n,int m){
int cont =0; //计算路径长度
s=s->next;
int i=0,j=0;
printf("第%d条路径为:\n",flag);
for(i=0;i<n;i++){ //按图形输出
for(j=0;j<m;j++){
if(maze[i][j]==2) printf("* ");
else printf("%d ",maze[i][j]);
}
printf("\n");
}
while(s->next){ //将栈中的元素输出为直观路径
printf("(%d,%d)->",s->x+1,s->y+1);
s=s->next;
cont++;
}
printf("(%d,%d)",s->x+1,s->y+1);
cont++;
printf("\n");
printf("路径长度为:%d\n\n",cont);
}
📢 转载请注明出处🎈 码字不易,能跑出想要的效果的话点个赞叭