数据结构实验报告 迷宫.docx
《数据结构实验报告 迷宫.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告 迷宫.docx(7页珍藏版)》请在冰豆网上搜索。
![数据结构实验报告 迷宫.docx](https://file1.bdocx.com/fileroot1/2022-12/31/727e7117-0497-4c0b-9890-b25a83767a1e/727e7117-0497-4c0b-9890-b25a83767a1e1.gif)
数据结构实验报告迷宫
数据结构实验报告
实验三迷宫
姓名:
xxx
学号:
xxx
专业:
信息安全
实验日期:
第十二.三周周日
实验三迷宫
一、实验目的
1、了解回溯法在求解迷宫问题中的应用
2、进一步掌握栈的使用
二、实验内容
用回溯法求解迷宫问题,可以用一个栈保存探索的序列。
并且在该迷宫的行走中,站在一点可以有八个方向选择。
比如如下的迷宫
Enter->0111000000
0001000100
0101100100
0100101100
0100101100
1110101000
0010001011
0010001011
0110101000
0000101100-->EXIT
下面是可能的路径(注意:
从入口到出口可能有多条路径,优先选择的方向不同,路径可能也不一样!
)
Path:
(maze[0][0],maze[1][0],maze[1][1],maze[1][2],maze[2][2],
maze[3][2],maze[3][3],maze[4][3],maze[5][3],maze[6][3],
maze[6][4],maze[6][5],maze[5][5],maze[4][5],maze[3][5],
maze[2][5],maze[2][6],maze[1][6],maze[0][6],maze[0][7],
maze[0][8],maze[1][8],maze[2][8],maze[3][8],maze[4][8],
maze[5][8],maze[5][7],maze[6][7],maze[7][7],maze[8][7],
maze[8][8],maze[8][9],maze[9][9])
Enter->X11100X---X---X0
X---X---X100X1X0
01X11X---X1X0
01X---X1X11X0
010X1X11X0
111X1X1X---X0
001X---X---X1X11
0010001X11
0110101X--X--X
000010110X-->EXIT
1、提示:
(1)数据结构:
✧用二维数组MAZE[m+2][n+2]表示迷宫的结构,数组中的值为1表示是墙,为0表示可以走通。
(用MAZE[m+2][n+2]而不用MAZE[m][n]的原因在于想表示和编写代码的时候简单些,而且让迷宫周围都是墙,防止错误的走出去)
✧用二维数组MARK[m+2][n+2]表示迷宫是否被走过,主要是为了回溯时已经证明走不通的路线就不要再去走了。
(用MARK[m+2][n+2]而不用MARK[m][n]的原因在于想表示和编写代码的时候简单些)
✧二维数据MOVE[8][2]是为了更方便的移动到下一步,改变坐标。
这个二维数组是为了更好的转换坐标(八个方向,从0到7),而且也能避免重复走路
✧用栈保存走过的路径
(2)输出:
✧迷宫布局,用0表示可以走通的地方,用1表示墙
✧如果能走通,则输出路径和路径的长度;若不能走通,则输出提示不能走通
✧带有路径的迷宫布局
头文件部分
#ifndefMIG_H
#defineMIG_H
structzhan
{intMAX;
intn;
int*s;
};
typedefstructzhan*seqstack;
seqstackvoidzhan(intm);
intisnullzhan(seqstackpastack);
voidyazhan(seqstackpastack,intk);
voidchuzhan(seqstackpastack);
voidnizhan(seqstackpastack);
inttopzhan(seqstackpastack);
voidprintzhan(seqstackpastack);
voidmigonglujin(intmaze[8][11],intdirection[4][2],intx1,inty1,intx2,inty2,intm);#endif
函数算法实现部分
#include"ma.h"
#include
#include
seqstackvoidzhan(intm)//创建一个空栈
{seqstackpastack=(seqstack)malloc(sizeof(structzhan));
if(pastack!
=NULL)
{pastack->s=(int*)malloc(sizeof(int)*m);
if(pastack->s)
{pastack->MAX=m;
pastack->n=-1;
returnpastack;}
elsefree(pastack);
}
printf("over");
returnNULL;
}
intisnullzhan(seqstackpastack)//判断栈是否为空
{return(pastack->n==0);}
voidyazhan(seqstackpastack,intk)//压栈
{if(pastack->n>=pastack->MAX-1)
{printf("不好意思,这站满人了,等下一站吧,亲!
");
}
else
{pastack->n++;
pastack->s[pastack->n]=k;}
}
voidchuzhan(seqstackpastack)//出栈
{if(pastack->n==0)
{printf("我都空了");}
else
{pastack->n=pastack->n-1;}
}
inttopzhan(seqstackpastack)//取栈顶元素
{if(pastack->n==-1)
{printf("木有东西哦!
无顶!
");}
else
{return(pastack->s[pastack->n]);
}
}
voidprintzhan(seqstackpastack)//打印栈
{intb;
b=pastack->n;
while(b>-1)
{printf("%d",pastack->s[b]);
printf("");b--;}}
voidnizhan(seqstackpastack)//将栈倒置,即:
逆栈
{inti;
for(i=0;i<=pastack->n;i++)
{printf("%d",pastack->s[i]);
printf("");}
}
voidmigonglujin(intmaze[8][11],intdirection[4][2],intx1,inty1,intx2,inty2,intm)
{inti,j,k;
intg,h,x,y,d;
seqstackc;
c=voidzhan(m);
maze[x1][y1]=2;
x=x1;
y=y1;
d=-1;
yazhan(c,x);
yazhan(c,y);
while(!
isnullzhan(c))
{y=topzhan(c);
chuzhan(c);
x=topzhan(c);
chuzhan(c);
i=x;
j=y;
k=d+1;
while(k<=3){g=i+direction[k][0];
h=j+direction[k][1];
if(g==x2&&h==y2&&maze[g][h]==0)
{printf("打印路径上的每一点(以<-为开始端哦!
且按这个方向走!
)");
//nizhan(c);
while(!
isnullzhan(c))
{
y=topzhan(c);
//printf("这是Y点");
//printf("%d",y);
chuzhan(c);
x=topzhan(c);
chuzhan(c);
//printf("这是X点");
//printf("%d",x);
//chuzhan(c);
//printf("");
printf("%d%d",x,y);printf("<-");
}
return;
}
if(maze[g][h]==0)
{maze[g][h]=2;
x=i;y=j;d=k;
yazhan(c,x);
yazhan(c,y);i=g;j=h;k=-1;
}
k=k+1;
}
}
printf("thepathhasnotbeenfound.\n");
}
主函数部分
#include"ma.h"
#include"stdlib.h"
#include"stdio.h"
voidmain()
{
intmaze[8][11]={{1,1,1,1,1,1,1,1,1,1,1},
{1,0,1,0,0,1,1,1,0,0,1},
{1,0,1,0,0,0,1,0,0,1,1},
{1,0,1,1,1,0,0,0,1,1,1},
{1,0,0,0,1,1,1,1,0,1,1},
{1,1,0,0,1,0,1,1,1,1,1},
{1,1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1}};
intdirection[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
printf("求迷宫路径:
");
migonglujin(maze,direction,1,1,6,9,200);}