迷宫中节点类型及队列类型: struct pointlint row , col , predecessor } que [512]
### (2)XXX算法
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)打印迷宫图形
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,即到达出口节点,即找到了路径,结束
如果 p . col +1<n且maze[p.row][p.co1+1]==0,说明未到迷宫右边界,且其右方有通路,则visit(p.row,p.col+1,maze),将右边节点入队标记己访问
如果 p . row +1<m且maze[p.row+1][p.col]==0,说明未到迷宫下边界,且其下方有通路,则visit(p.row+1,p.col,maze),将下方节点入队标记已访问
如果 p . col -1>0且 maze [ p . row ][ p .co1-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;)