(8)出队 dequeue()
(9)判断队列是否为空 is_empty() (10)访问节点 visit() (11)搜索迷宫路径 mgpath()
2.3系统详细设计
实现概要设计中定义的所有数据类型及操作的伪代码算法 1.节点类型和指针类型
迷宫矩阵类型:int maze[M+2][N+2];为方便操作使其为全局变量 迷宫中节点类型及队列类型:
struct point{int row,col,predecessor}que[512] 2.迷宫的操作 (1)手动生成迷宫
void shoudong_maze(int m,int n) {定义i,j为循环变量 for(i<=m) for(j<=n)
输入maze[i][j]的值 } (2)自动生成迷宫
void zidong_maze(int m,int n) {定义i,j为循环变量 for(i<=m) for(j<=n)
maze[i][j]=rand()%2 //由于rand()产生的随机数是从0到 RAND_MAX,RAND_MAX是定义在stdlib.h中的,其值至少为32767),要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X;
}
(3)打印迷宫图形
第 6 页 共 31 页
void print_maze(int m,int n)
{用i,j循环变量,将maze[i][j]输出 □、■} (4)打印迷宫路径
void result_maze(int m,int n)
{用i,j循环变量,将maze[i][j]输出 □、■、☆} (5)搜索迷宫路径 ①迷宫中队列入队操作
void enqueue(struct point p) {将p放入队尾,tail++} ②迷宫中队列出队操作
struct point dequeue(struct point p) {head++,返回que[head-1]} ③判断队列是否为空
int is_empty()
{返回head==tail的值,当队列为空时,返回0} ④访问迷宫矩阵中节点
void visit(int row,int col,int maze[41][41]) {建立新的队列节点visit_point,将其值分别赋为
row,col,head-1,maze[row][col]=2,表示该节点以被访问过;调用enqueue(visit_point),将该节点入队} ⑤路径求解
void mgpath(int maze[41][41],int m,int n)
{先定义入口节点为struct point p={0,0,-1},从maze[0][0]开始访问。如果入口处即为障碍,则此迷宫无解,返回0 ,程序结束。否则访问入口节点,将入口节点标记为访问过maze[p.row][p.col]=2,调用函数enqueue(p)将该节点入队。
判断队列是否为空,当队列不为空时,则运行以下操作: { 调用dequeue()函数,将队头元素返回给p,
如果p.row==m-1且p.col==n-1,即到达出口节点,即找到了路径,结束;
第 7 页 共 31 页
如果p.col+1 如果p.row+1 如果p.col-1>0且maze[p.row][p.col-1]==0,说明未到迷宫左边界,且其左方有通路,则visit(p.row,p.col-1,maze),将左方节点入队标记已访问; 如果p.row-1>0且maze[p.row-1][p.col]==0,说明未到迷宫上边界,且其上方有通路,则visit(p.row,p.col+1,maze),将上方节点入队标记已访问。 } 访问到出口(找到路径)即p.row==m-1且p.col==n-1,则逆序将路径标记为3即: maze[p.row][p.col]==3; while(p.predecessor!=-1) {p=queue[p.predecessor]; maze[p.row][p.col]==3;} 最后将路径图形打印出来。 搜索算法流程如图2.3所示: 第 8 页 共 31 页 图2.3 迷宫路径搜索流程图 3.菜单选择 while(cycle!=(-1)) ☆ 手动生成迷宫 请按:1 ☆ 自动生成迷宫 请按:2 ☆ 进入迷宫游戏 请按:3 ☆ 退出迷宫游戏 请按:4 ☆ ~~特别鸣谢~~ 请按:0 scanf(\ switch(i) { case 1:请输入行列数(如果超出预设范围则提示重新输入) 第 9 页 共 31 页
相关推荐: